私はファイル名とディレクトリ名を小文字に変更し、すべてのスペースを「-」に置き換えるスクリプトを探しています。私は別のスクリプトで以下のスクリプトを見つけましたが、それがどのように機能するかを完全に理解していません。誰でも私を案内していただきありがとうございます。
find ./* -depth -type d -exec sh -c '
t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
[ "$t" = "$0" ] || mv -i "$0" "$t"
' {} \;
ベストアンサー1
find ./* -depth -type d -exec sh -c ' ... ' {} \;
find
ツリー内のすべてのディレクトリ(-type d
)を削除し、各ディレクトリに対してシェルフラグメントを実行して$0
現在の名前に設定します。-depth
各ディレクトリの内容を最初に処理し、ディレクトリ自体が最後に処理するようにします。 (そうでない場合は、名前を変更すると問題が発生する可能性があります。)
t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
${0%/*}
最後のスラッシュとその後のすべての項目を削除します$0
。つまり、ディレクトリ名を保持します。${0##*/}
基本的にその逆です。 (それらの種類はパラメータ拡張)は、printf | tr
名前の最後の部分を小文字に変更するために使用されます。結果は(に割り当てられますt
。$(...)
コマンドの置き換え)
[ "$t" = "$0" ] || mv -i "$0" "$t"
テストinの新しい名前t
とinの古い名前が$0
同じであることを確認してください。いいえその後、電話mv
をかけます。
ここで愚かな部分は、同じようfind
に呼び出すことができ、ファイル名を見つける操作なので、find . -depth ...
ファイル名ワイルドカード()は必要ありません。代わりに、ファイル名のディレクトリ部分を処理する必要はありません。ターゲットファイル名の使用は少し誤った形式です。これはスクリプト自体の名前を意味します。find ./*
find
-execdir
-exec
$0
ファイルとディレクトリの名前を変更し、スペースをダッシュに変更することについて言及しました。私が知る限り、ここのコマンドはどちらも行いません。find -type d
ディレクトリのみをキャプチャするには、を使用して-type f
通常のファイルのみをキャプチャするか、型を無視するようにしてください。また、空白の内容はありませんが、たとえば、すべての空白をダッシュに変更することtr
で変更できます。tr "[:upper:][:space:]" "[:lower:][-*]"