再帰的にファイル名を変更する

再帰的にファイル名を変更する

私はLinuxに初めて触れたので、助けが必要です。

現在のディレクトリ以外のすべてのサブディレクトリの内容に適用する方法はありますか?

for f in *\ *; do mv "$f" "${f// /_}"; done

ベストアンサー1

そしてzsh

autoload zmv # best in ~/.zshrc
zmv '(**/)(* *)' '$1${2// /_}'

コードと同様に、隠しファイルの名前は変更されません。また、隠されたディレクトリの内部も見ていません。名前を変更するには、次のように変更してください。

autoload zmv # best in ~/.zshrc
zmv '(**/)(* *)(#qD)' '$1${2// /_}'

後者と同じですbash(ただし、保護は提供されていないため、オプションをzmv追加する必要があるかもしれません)。-imv

LC_ALL=C find . -depth -name '* *' -exec bash -c '
  for file do
    base=${file##*/}
    mv -i -- "$file" "${file%/*}${base// /_}"
  done' bash {} +

-prune最初のものと組み合わせることができないため(隠しディレクトリに移動する必要はありません)、単純な機能はありません-depth。ただし、機能的に同等の機能は次のように書くことができます。

LC_ALL=C find . -depth -name '* *' ! -path '*/.*' -exec bash -c '
  for file do
    base=${file##*/}
    mv -i -- "$file" "${file%/*}${base// /_}"
  done' bash {} +

隠しディレクトリにドロップダウンされますが、そのディレクトリのファイル名は変更されません。

おすすめ記事