名前には、21から29までの数字を含むファイルのバッチがあります。何百ものファイルを手動で削除したくないので、端末を使ってみました。
for f in *;
do for x in {21..29};
rename=`echo "$f" | sed 's/\$x//'`
mv "$f" "$rename"; done;
しかし、何も起こりませんでした。一部のファイルを含むテストフォルダで楽しんで「$ x」を文字「a」に置き換えると、最初の文字「a」は実際には削除されますが、数字では機能しません。私は何が間違っていましたか?
どんな助けでも本当に感謝します!ありがとうございます!
ベストアンサー1
一重引用符内にあると、コマンドは拡張されないため、コマンドsed
は機能しません。$x
しかし、実際には仕事に間違ったツールを使用しています。
シェルが利用可能な場合は、そのシェルに切り替えて、貢献したモジュールと組み込みの数値グローブ範囲をzsh
活用することをお勧めします。zmv
<m-n>
前任者。与えられた
% ls -d -- *.mp4
'video snap 02 car 23 December.mp4' 'video snap car 23 December.mp4'
それから
% autoload -Uz zmv
% zmv -n '(*) <21-29> (*.mp4)' '$1 $2'
mv -- 'video snap 02 car 23 December.mp4' 'video snap 02 car December.mp4'
mv -- 'video snap car 23 December.mp4' 'video snap car December.mp4'
-n
交換が正常に機能すると思われる場合は削除してください(対処なし)。
zshが利用できない場合は、数値範囲を単純なシェルパターンで表すことができるので、bashで次のことができます。
$ for f in *2[123456789]*.mp4; do echo mv -n -- "$f" "${f/ 2[123456789]}"; done
mv -n -- video snap 02 car 23 December.mp4 video snap 02 car December.mp4
mv -n -- video snap car 23 December.mp4 video snap car December.mp4
この場合はecho
、実際に名前を変更したファイルを削除してください(-n
名前の競合が上書きされるのを防ぐため、アーカイブしてください)。