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


17

私は次のような名前の画像ファイルを含むディレクトリを持っています

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

残念ながら、画像名はゼロ基づいていなければならない、そうimage1.jpgでなければなりませんimage0.jpgimage2.jpgする必要がありますimage1.jpgようにと。

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

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

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


6
実際には、ギャップがない限り、これが最も簡単な方法です。(for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done
リッキービーム14

5
画像の順序は重要ですか?そうでない場合は、最後の画像の名前をimageN.jpgto から変更するだけでimage0.jpg完了です。
jnovacho 14

@jnovacho、非常に賢い!しかし、はい、画像の順序は重要です。
ウェス14

回答:


20

古き良きperlの名前変更:

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

[備考]

イメージ番号は0より大きい必要があります。

画像が9より大きく、先頭に0が付いていない場合$(ls -v1 *)、クラッバーを避けるために使用します。@arielfが提案し、@ Graemeが気付きました。

疑わしい場合は-v、冗長および-nアクションなしにも使用します。


「e」は何を示していますか?
ウェス14

3
「e」は評価を意味し、置換セクションが評価されます。参照perlreref

6
上書きを避けるため、ファイルは昇順で渡す必要があります。これは、ファイルが10個未満の場合(または数字の先頭にゼロがある場合)にのみ機能します。
グレアム14

私はすでにこれに気づきました、また0ソースにあるべきではありません。

2
*最後のをに置き換えると、`ls -v1 *`破壊から安全になります。最小値から最大値になります。
アリエル14

6

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

command_that_generates_mv_commands | bash

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


それはきれいではありません。:)ただし、問題を解決するため、+ 1。
JMCF125 14

5

ls出力で繰り返すことができます。これはあなたの例で動作します:

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

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


1
使用した方が良い-i-nとはmv、それがエッジケースに上書きを防止します。
グレアム14

sort -V代わりに良くないでしょうか?
user80551

sort動作しません。問題になるimage10.jpgimage1.jpgに表示されます。sort -nk 1.8@Graemeの答えのように必要です。
テルドン

@ user80551 sort -Vは良いアイデアです、私の答えにそれを追加します。ただし、他のエッジケースもあります。一般的に、誰かがコピーして何らかの損害を与える場合に、このような質問にこの種のオプションを追加するだけの良いアドバイスです。
グレアム14

4

以下は、パターンに適合するものなら何でも動作するよう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

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


1
使用した方が良い-i-nとはmv、それがエッジケースに上書きを防止します。
グレアム14

非常に良い提案、答えを編集します
brm 14

macOSでは、オプションを使用する必要sort -nがあり-Vます。
ヴィンセントシット

4

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


このファイルには既にファイルが存在します。
ウェス14

4

zsh

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

-n幸せなときに削除)。

(n)はリストを数値でソートすることimage9.jpgですimage10.jpg

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.