ファイルをバックアップし、使用したファイルを上書きするのを防ぐためにスクリプトを使用していますcp --backup
。これが原因example.mov.orig
でtest.mov.orig
。私は正規表現をまったく理解することはできませんし、名前の変更を使用してデフォルトの名前を切り取り、追加する方法を知っている.orig
人がいるかどうか疑問に思います。_1
本質的に私が探している結果は、example.mov.orig
私がexample_1.mov
結合できるものに変更されるコマンドです。find /example/ -name *.*.orig
出力は次rename --version
のとおりです。util-linux-ng 2.18
答え1
必要なコマンドはrename
次のとおりです。
以下を使用
rename
する場合util-linux
:rename . _1. *.orig && rename .orig '' *.orig
.で終わるすべてのファイルの場合、最初の項目は最初の項目を置き換えます
.
。 2番目のエントリはファイル名から削除されます。_1.
.orig
.orig
perl-rename(Debianベースのシステムのデフォルト)を使用すると、状況がはるかに簡単になります。これはPerl準拠の正規表現を使用しているため、すべての操作を1段階で実行できるためです。
rename 's/(\..*)\.orig/_1$1/' *orig
このバージョンは正規表現を使用するため、最初の
.
(\.
、.
tiはエスケープされていない「すべての文字」を意味するため、エスケープする必要があります)と一致し、それ.*
までのすべての項目()と一致します.orig
。最初のパターンは括弧内にあるため、「キャプチャ」され、後で呼び出すことができます$1
。したがって、置換は、以前_1
にaとキャプチャされたパターン(最初の拡張子)に一致するすべての項目を置き換え、同時に削除します.orig
。
次のコマンドを組み合わせることができますfind
。
find /example -name '*.orig' -exec rename . _1. {} +
find /example -name '*.orig' -exec rename .orig '' {} +
または:
find /example -name '*.orig' -exec rename 's/(\..*)\.orig/_1$1/'
これも必要ありませんfind
。すべてのファイルが同じディレクトリにある場合は、上記のコマンドを直接使用するか再帰的に作成できます(bashを使用すると仮定)。
shopt -s globstar ## make ** recurse into subdirectories
rename.ul . _1. **.orig && rename.ul .orig '' **.orig ## util-linux
rename 's/(\..*)\.orig/_1$1/' **orig ## perl rename
実際には、技術的には必要はありませんrename
。シェルですべての操作を実行できます(参照:ここシェルの文字列操作機能に関する注):
for file in **/*.orig; do
newname="${file%%.*}_1.${file#*.}"
mv "$file" "${newname/.orig/}"
done
最後に、globに関する注意(-name
正規表現ではなくglobを使用してください。)。*.*.orig
Windows glob 構文は、 " .orig
"で終わるすべてを意味します。これに対応するものと一緒に使用しなければならないのfind
はです*.orig
。*
単独で使用すると何でも一致し、使用すると*.*.orig
2つの拡張子を持つファイル名のみが一致します。最後の拡張子は.orig
。
答え2
まず、システムにどのバージョンの名前変更がインストールされているかを確認する必要があります。
readlink -e $(which rename)
したがって、prename
(.debホストのデフォルト):
prename 's/(\.[^.]*)\.orig/_1$1/' *.*.orig
rename.ul
util-linuxパッケージから
rename.ul \. _1\. *.*.orig #add «_1» into file name
rename.ul \.orig '' *.*.orig #remove «.orig» extention