私は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
追加する必要があるかもしれません)。-i
mv
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 {} +
隠しディレクトリにドロップダウンされますが、そのディレクトリのファイル名は変更されません。