このスクリプトがどのように機能するかを説明できる人はいますか?

このスクリプトがどのように機能するかを説明できる人はいますか?

私はファイル名とディレクトリ名を小文字に変更し、すべてのスペースを「-」に置き換えるスクリプトを探しています。私は別のスクリプトで以下のスクリプトを見つけましたが、それがどのように機能するかを完全に理解していません。誰でも私を案内していただきありがとうございます。

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:][-*]"

おすすめ記事