次のデジタルファイルがあります。
test01-aaa.txt
test02-bbb.txt
test03-ccc.txt
test04-ddd.txt
名前から aaa、bbb、ccc、ddd 部分を削除する必要があります。私ができる最善は何ですか?コマンドを試しましたが、'rename'
どうやってこのように使用できますか?
rename -v "test??-*.txt" "test??.txt" *.txt
次のファイルがあります。
test01.txt
test02.txt
test03.txt
test04.txt
答え1
シェルの単純なループ(これは次の事実を避けます。rename
このユーティリティにはいくつかの競合するバリエーションがあります。):
for name in test??-*.txt; do
mv "$name" "${name%%-*}.txt"
done
このループは、指定されたパターンに一致する現在のディレクトリのすべての名前を繰り返します。これらの名前ごとに-
標準引数置換を使用して、最初の文字列の末尾から文字列の終わりを切り捨てます。置換は、${variable%%pattern}
変数値から一致する最長のサフィックス文字列を削除します。次に、代替結果にサフィックスを追加します。pattern
variable
.txt
bash
シェルでは、nullglob
一致するファイル名なしで単一の反復が実行されないように、ループを実行する前にシェルオプションを設定する必要があります。
mv
GNUシステム(またはmv
GNU coreutilsを持つすべてのシステム)にオブジェクトファイルがすでに存在する場合は、そのオブジェクトファイルを使用または-b
バックアップできます。--backup
それ以外の場合、-b
上記のループは既存のファイルを上書きするように名前の競合を処理します。