ファイル名を最後の4桁まで切り捨てようとしています(例:941_S_5193が5193になります)。このコマンドをループして約600個のファイルに適用する最も簡単な方法は何ですか?
ありがとうございました。 -KM
rename
コマンドは、これを十分に実行できます。
# Note, -n flag used for testing only, remove for actual renaming
$ ls
941_P_5191 941_P_5192 941_P_5193 941_P_5194
$ rename -n 's/^(.*)_([0-9]{4})$/$2/' ./*
./941_P_5191 renamed as 5191
./941_P_5192 renamed as 5192
./941_P_5193 renamed as 5193
./941_P_5194 renamed as 5194
for
ループ内でbashとmvのプレフィックス削除を行うこともできます。
$ for f in ./*; do echo mv "$f" "${f##*_}"; done
mv ./941_P_5191 5191
mv ./941_P_5192 5192
mv ./941_P_5193 5193
mv ./941_P_5194 5194
注:実際の名前変更を行うには、echo
を削除してください
941_S_5193
を1つのファイル名として指定しましたが、さらに役立つものはほとんどありません。私は941_S_5193
と呼ばれるサンプルファイルを使用してこのfind
コマンドを実行しました。
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
サンプルファイル名:
941_S_5194
923_D_5234
941_S_5193
941_S_5134
941_A_0034
941_C_9034
このコマンドの使用:
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
ファイル名に次の変更を加えます。
rename(./941_S_5194, ./5194)
rename(./923_D_5234, ./5234)
rename(./941_S_5193, ./5193)
rename(./941_S_5134, ./5134)
rename(./941_A_0034, ./0034)
rename(./941_C_9034, ./9034)
結果:
0034
5134
5193
5194
5234
9034
コマンドを完全に評価する手順は次のとおりです。
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*'
を使用して、変更されるファイルを見つけます。(1)
が失敗した場合、regex
はファイル名と一致しません。正規表現を微調整し、質問を更新します。期待どおりに起動したら、ステップ(1)で-exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
部分をコマンドに追加し、名前が変更されたものを見つけて表示します。
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
完了したら、-n
オプションを削除して、これらのファイルの名前を実際に変更します。そのようです:
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
ls | tail -c 5
を使用してディレクトリ内のアイテムをループ処理し、各ファイルの最後の4桁をリストすることをお勧めします。