web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイル名から1を引きます(名前を変更します)。

次のような名前の画像ファイルを含むディレクトリがあります

image1.jpg 
image2.jpg 
image3.jpg
...

残念ながら、画像名はゼロから始まる必要があるため、image1.jpgimage0.jpgimage2.jpgimage1.jpg 等々。

これらのようなgenerate mvコマンドにスクリプトを記述して、シェルスクリプトに入れ、実行することができます-

mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...

しかし、私はUnixでそれを行うためのより良い方法があると思います。それは何ですか?

18
Wes

古き良きPerlの名前変更:

_rename 's/(\d+)(\.jpg)/($1-1).$2/e' *
_

[備考]

画像番号は0より大きくなければなりません。

画像が9より大きく、先頭に0がない場合は、$(ls -v1 *)を使用して、破損を回避します。 @arielfによって提案され、@ Graemeによって通知されます。

疑わしい場合は、詳細には_-v_を、アクションなしには_-n_も使用してください。

21
user55518

生成されたmvコマンドをbashにパイプできます。したがって、それらをスクリプトにコピーして実行する必要はありません。見る:

command_that_generates_mv_commands | bash

そして、bashにパイプされたすべてが実行されます。

6
chaos

あなたはls出力で繰り返すことができます、これはあなたの例のために働きます:

i=0 
for file in $(ls *.jpg | sort) ; do 
     mv $file $(echo $file | sed 's/[0-9]*.jpg$/'${i}'.jpg/')
     i=$((++i))
done

ファイルの同じパス上にいる必要があります

5
babasbot

次のパターンは、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

個人的には、ファイルを処理する順序によって大きな違いが生じる可能性があるため、名前を別のファイル名に変更することをお勧めします。

4
brm

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_を削除して、意図したとおりに機能することを確認します。そうする前に、既存のファイルについて警告します。ただし、ファイル名の昇順で名前が変更されている限り、実際に実行しても競合は発生しません。

4
Graeme

zshの場合:

autoload zmv # (in ~/.zshrc)
zmv -Qf -n 'image(<->).jpg(n)' 'image$(($1-1)).jpg'

(満足したら-nを削除してください)。

(n)はリストを数値でソートするため、image9.jpgimage10.jpgの前に名前が変更されます。

4