~/folder/ contain (最新のファイルから最も古いファイルまで) と同じディレクトリにあるすべてのファイルの名前を変更しようとしています: apple.foo, Pie.foo, cookie.foo, melon.foo
固定プレフィックスと数字001を使用して名前を変更します。最も古い999に増加
melon.foo >> object001.foo
Cookie.foo >> object002.foo
パイ.foo >> object003.foo
apple.foo >> object004.foo
誰でもこれを達成する方法を知っていますか?
ベストアンサー1
zsh
シェルの使用:
counter=0
for name in $HOME/folder/*(.NDOm); do
counter=$(( counter + 1 ))
suffix=$name:e
printf -v newname '%s/object%.3d%s' $name:h $counter ${suffix:+.$suffix}
mv $name $newname
done
~/folder
これは、最後に変更されたタイムスタンプに基づいて、最も古いものから最新のものまで、ディレクトリ内の一般ファイルのすべての名前を繰り返します。各名前に対して、現在の名前のディレクトリ部分とカウンタを使用して新しい名前を設定します。ファイル名が新しい名前に変更されます(確認は不要、名前の競合の確認はありません)。
このprintf -v newname
呼び出しは出力を変数として「印刷」しますnewname
。書式文字列は、3つの位置(たとえば、等)に%.3d
ゼロで埋められた整数を出力します。001
パラメータ拡張は、パス名のヘッダー/ディレクトリ部分に拡張されます(同じ)。023
109
$name:h
$name
dirname "$name"
元のファイル名(つまり、現在のファイルが)に拡張される$name:e
「拡張子」はに保存されます。ファイル拡張子がある場合は、前にドットを追加します。foo
apple.foo
suffix
${suffix:+.$suffix}
ファイル名ワイルドカードパターンの末尾のinは、古いワイルドカードパターンが通常のファイルにのみ一致するようにするワイルドカード文字です.
。パターンがシェルに設定されているかのように動作するようにします(.NDOm)
(一致するものがない場合は、何も展開せずに結果に隠された名前を含めます)。最も古い(最も最近変更された)ファイルが最初にソートされるように、一致する名前をソートします。N
D
nullglob
dotglob
bash
Om
ログインシェルでない場合は、zsh
スクリプトとして実行できます。
$ zsh ./this-script