
名前には、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
名前の競合が上書きされるのを防ぐため、アーカイブしてください)。
答え2
for f in *;
do echo "$f" | awk '{gsub("[0-9]{2,}", "", $0); print}' |xargs -I {} mv "$f" {}
done
このコードは、すべてのファイルを繰り返し、名前をパイプで連結します。アッ、awkは2桁以上の数字を置き換え、次にパイプします。MVコマンド(名前変更用)。
パラメータ標準入力を正しい引数位置に渡すために使用されます。
編集:filenameに関する新しい情報を提供したので、video snap 02 car 23 December.mp4
このコードは名前の最後から2番目のフィールドにある数字のみを削除する必要があります。
for f in *;
do echo "$f" | awk '{gsub("[0-9]", "", $(NF-1)); print}' |sed 's/ / /g' |xargs -I {} mv "$f" {} ;
done