すべてのフォルダとファイル名の文字列を別の文字列に再帰的に置き換える方法は?私はRed Hat 6を実行しており、次のように見つけることができます。
find . -name \*string\*
ファイルの文字列を使用してこれを実行しました。
find . -type f -exec sed -i 's/string1/string2/g' {} +
しかし、同様の方法ですべてのファイル名をどのように変更できますか?
答え1
使用find
とrename
:
find . -type f -exec rename 's/string1/string2/g' {} +
このコマンドの意味の1つは、現在のディレクトリ()からすべてのファイル()をfind . -type f
検索することです。-type f
.
この
-exec
オプションは、見つかっfind
たファイルごとにコマンドを実行するように指示します。この
rename
コマンドはファイルの名前を変更するために使用されます。ここで使用される構文は、Perlバージョンのrename
。's/string1/string2/g'
検索する内容と置換する内容を指定する正規表現です。この場合、string1
置き換える文字列はstring2
置換文字列です。末尾のエントリはファイル名のすべてのエントリを/g
置き換えます。string1
この
{}
記号は、見つかったファイル名のプレースホルダーですfind
。+
最後のコマンドは、find
複数のファイル名を rename コマンドに一度に渡すように指示します。これは、個々のファイルごとに rename を呼び出すよりも効率的です。
したがって、要約すると、このコマンドは現在のディレクトリ内のすべてのファイルを検索し、見つかったrename
各ファイルのファイル名をすべて変更するコマンドを実行しますstring1
。string2
答え2
for
mv
コマンドを使用してすべてのファイル名を変更できます。
abc
ここでは、名前で始まるすべてのテキストファイルを次のように置き換えます。xyz
for file in abc*.txt; do mv -v "$file" "${file/abc/xyz}"; done
次のコマンドは、すべてのフォルダのファイルを再帰的に置き換えます。
for file in `find . -type f -name 'abc*.txt'`; do mv -v "$file" "${file/abc/xyz}"; done
答え3
zsh
使いやすくなりますzmv
。
autoload zmv # best in ~/.zshrc
zmv '(**/)(*string1*)' '$1${2//string1/string2}'
に変更
zmv '(**/)(*string1*)(#qD)' '$1${2//string1/string2}'
隠しファイルや隠しディレクトリのファイル名も変更したい場合。