bashで別のファイルの間に新しいファイル名を挿入する関数を作成するには?

bashで別のファイルの間に新しいファイル名を挿入する関数を作成するには?

、...Titlepageという名前のファイルが多く、そのファイルがあるというディレクトリがあるとします。 2つのファイル名を変更するbash機能があります。 (たとえば、このコマンドはファイル名を.に変更し、そのファイルに対して同じことを行います。)titlepage_1.pdftitlepage_2.pdftitlepage_n.pdftex$alterpdf 2 3titlepage_2.pdftitlepage_3.pdftex

function swap(){ mv $1 $1._tmp && mv $2 $1 && mv $1._tmp $2; }
function alterpdf(){ swap titlepage_$1.pdf titlepage_$2.pdf; swap titlepage_$1.tex titlepage_$2.tex; }  

filepush new.pdf 2 3new.pdfこれで、内部に挿入しtitlepage_2.pdftitlepage_3.pdf名前を付けることができる関数(たとえば)が必要ですtitlepage_3.pdf。そして、次のファイルの数が増加します。titlepage_3.pdf待つ titlepage_4.pdf titlepage_4.pdftitlepage_5.pdf

.texこのディレクトリには、すべてのPDFを含むファイルもあります。

編集する
私は以下を実装したいと思います -

Titlepage$ ls
titlepage_1.tex titlepage_1.pdf titlepage_2.tex titlepage_2.pdf titlepage_3.tex titlepage_3.pdf
Titlepage$ vim new.tex
Titlepage$ pdflatex new.tex
Titlepage$ ls
new.pdf new.tex titlepage_1.tex titlepage_1.pdf titlepage_2.tex titlepage_2.pdf titlepage_3.tex 
titlepage_3.pdf
Titlepage$ push new.pdf 2 3
Titlepage$ ls
titlepage_1.tex titlepage_1.pdf titlepage_2.tex titlepage_2.pdf titlepage_3.tex titlepage_3.pdf titlepage_4.tex titlepage_4.pdf

編集する
提案された解決策

$ls *.pdf|grep -Eo [0-9]+|sort -n  

これによりファイルのインデックスが作成されます。尾から始まり、挿入ポイント(2番目のパラメータpush)まで、各ファイルに1を追加して各インデックスを増やします。次に、new.pdfターゲットファイル()の名前を次のように変更します。titlepage_3rd_argement_of_push.pdf

ベストアンサー1

さて、ここにあなたがしたいことを行うスクリプトがあります。

#!/bin/bash

NEWFILES=${1}
INSERT_IDX=${2}
PREFIX="titlepage_"

# just in case
prefixnum=${filebase//[^0-9]/}
case $prefixnum in
  (*[![:blank:]]*) echo "invalid prefix, contains numbers"; exit 1;;
esac

# check input arguments
if [ ! $# -eq 2 ];
then
  echo "USAGE: insert.sh <newfiles> <insertion_index>"
  echo 'example: insert.sh "new.pdf new.tex" 2'
  exit 1
fi

## process infiles
for infile in ${NEWFILES}
do
  ext=${infile##*.}
  for file in $(ls -1 ${PREFIX}[0-9]*.${ext} | sort -rV)
  do

      filebase=${file%.*}
      number=${filebase//[^0-9]/}
      numberless=${filebase//[0-9]/}

      if [ "${numberless}${number}.${ext}" != "${file}" ];
      then
        echo "invalid file ${file}"
        echo "${numberless}${number}.${ext}" "${file}"
        exit 1
      fi

      if [ ${number} -ge ${INSERT_IDX} ]
      then
          echo "$file" "${numberless}$((${number} + 1))".$ext
          mv "$file" "${numberless}$((${number} + 1))".$ext
      else
        echo ${file}
      fi
  done
  echo "${infile}"  "${PREFIX}${INSERT_IDX}.${ext}"
  mv "${infile}"  "${PREFIX}${INSERT_IDX}.${ext}"
done

おすすめ記事