バッチファイル名から特定の番号を削除

バッチファイル名から特定の番号を削除

名前には、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

関連情報