次のような名前の画像ファイルを含むディレクトリがあります
image1.jpg
image2.jpg
image3.jpg
...
残念ながら、画像名はゼロから始まる必要があるため、image1.jpg
はimage0.jpg
、image2.jpg
はimage1.jpg
等々。
これらのようなgenerate mvコマンドにスクリプトを記述して、シェルスクリプトに入れ、実行することができます-
mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...
しかし、私はUnixでそれを行うためのより良い方法があると思います。それは何ですか?
古き良きPerlの名前変更:
_rename 's/(\d+)(\.jpg)/($1-1).$2/e' *
_
[備考]
画像番号は0より大きくなければなりません。
画像が9より大きく、先頭に0がない場合は、$(ls -v1 *)
を使用して、破損を回避します。 @arielfによって提案され、@ Graemeによって通知されます。
疑わしい場合は、詳細には_-v
_を、アクションなしには_-n
_も使用してください。
生成されたmv
コマンドをbash
にパイプできます。したがって、それらをスクリプトにコピーして実行する必要はありません。見る:
command_that_generates_mv_commands | bash
そして、bash
にパイプされたすべてが実行されます。
あなたはls出力で繰り返すことができます、これはあなたの例のために働きます:
i=0
for file in $(ls *.jpg | sort) ; do
mv $file $(echo $file | sed 's/[0-9]*.jpg$/'${i}'.jpg/')
i=$((++i))
done
ファイルの同じパス上にいる必要があります
次のパターンは、imageNUMBER.jpg
のパターンに適合するすべてのもので機能するようです。 echo
コマンドの前にmv
を置いて、最初にコマンドが何をするかを示しました。実際に名前を変更するには、echo
を削除するだけです
for i in `ls image*.jpg|sort -V` ; do
x=`echo $i|sed -e "s/image\(.*\).jpg/\1/"`
y=$(( $x - 1 ))
echo mv -i $i image$y.jpg
done
最初の行のls image*.jpg|sort -V
を使用すると、JPGファイルがファイル名に昇順の番号でリストされます。 x=
行は、ファイル名から番号を抽出します。次に、y=
行で数値を1つ減らします。次に、入力ファイル名とy
番号がmv
コマンドで使用されます。ここで、-i
フラグは、ファイルを上書きする前に通知します。
私自身の小さなテストでは、これは出力を生成しました:
mv -i image1.jpg image0.jpg
mv -i image2.jpg image1.jpg
mv -i image123.jpg image122.jpg
個人的には、ファイルを処理する順序によって大きな違いが生じる可能性があるため、名前を別のファイル名に変更することをお勧めします。
Debianベースのディストリビューションで名前を変更するためにシンボリックリンクされているPerl
スクリプトprename
を使用する場合もGNU find
/sort
が必要です。ファイルはすべての上書きを防ぐために昇順に配置されます。
_find . -regex '\./image[0-9]+\.jpg' -print0 | sort -zV |
xargs -0 rename -n 's/(\d+)\.jpg$/@{[$1-1]}.jpg/'
_
_-n
_を削除して、意図したとおりに機能することを確認します。そうする前に、既存のファイルについて警告します。ただし、ファイル名の昇順で名前が変更されている限り、実際に実行しても競合は発生しません。
zsh
の場合:
autoload zmv # (in ~/.zshrc)
zmv -Qf -n 'image(<->).jpg(n)' 'image$(($1-1)).jpg'
(満足したら-n
を削除してください)。
(n)
はリストを数値でソートするため、image9.jpg
はimage10.jpg
の前に名前が変更されます。