次のように、ファイル名に数字ラベルを含む数百のファイル名があります。
AAAA #12 SSSS.TXT
BBB #231 CDF.TXT
CDFSDAAAA #1 AAAASS.TXT
次のように名前を変更したいと思います。
#012 - AAAA #12 SSSS.TXT
#231 - BBB #231 CDF.TXT
#001 - CDFSDAAAA #1 AAAASS.TXT
どうすればいいですか?
ありがとう
答え1
bashシェルでは
for file in *.TXT
do
[[ $file =~ \#([[:digit:]]+) ]] && mv -- "$file" "#$(printf '%03d' "${BASH_REMATCH[1]}") - ${file}"
done
これは、現在のディレクトリで次に終わるすべてのファイルを繰り返し、.TXT
bashの条件式演算子と=~
比較します。渡されたファイル名を右側の正規表現と比較します。正規表現は、ハッシュタグ(コメントではなくエスケープされている)といくつかの(括弧内にキャプチャされた)数を探します。貪欲な+
ので、最初の数字ではなく数字(大文字と小文字は空白)で終わるできるだけ多くの数字(1桁、4桁など)が必要です。
Bashはキャプチャされた数字を保存します${BASH_REMATCH[1]}
(最初の角かっこセットなので)。printf
3桁までゼロで対応する数字を入力-
し、残りの名前変更を実行するために追加します。
&&
名前変更は、一致が成功した場合にのみ発生します(リンク経由)。
答え2
rename
Perlベースのコマンドがある場合
$ rename -n 's/.*#(\d+).*/sprintf "#%03d - %s", $1, $&/e' *.TXT
rename(AAAA #12 SSSS.TXT, #012 - AAAA #12 SSSS.TXT)
rename(BBB #231 CDF.TXT, #231 - BBB #231 CDF.TXT)
rename(CDFSDAAAA #1 AAAASS.TXT, #001 - CDFSDAAAA #1 AAAASS.TXT)
(-n
テスト目的で追加)