すべてのフォルダとファイル名の文字列を置き換える方法

すべてのフォルダとファイル名の文字列を置き換える方法

すべてのフォルダとファイル名の文字列を別の文字列に再帰的に置き換える方法は?私はRed Hat 6を実行しており、次のように見つけることができます。

find . -name \*string\*

ファイルの文字列を使用してこれを実行しました。

find . -type f -exec sed -i 's/string1/string2/g' {} +

しかし、同様の方法ですべてのファイル名をどのように変更できますか?

答え1

使用findrename:

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各ファイルのファイル名をすべて変更するコマンドを実行しますstring1string2

答え2

formvコマンドを使用してすべてのファイル名を変更できます。

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}'

隠しファイルや隠しディレクトリのファイル名も変更したい場合。

関連情報