以下は、すべてのHTMLファイルをから移動しfoo
、空のディレクトリを削除します。
$ find foo -name '*.html' -type f -exec mv -nv "{}" '.' \;
foo/bar/1.html -> ./1.html
./1.html not overwritten
foo/baz/qux/3.html -> ./3.html
foo/baz/qux/5.html -> ./5.html
$ find foo -depth -type d -delete
残っているのは、競合するファイル名を持つHTMLファイル、HTMLファイルではないファイル、および空でないフォルダーです。
自動的にファイルの名前を変更してファイル名の重複を防ぐには、を使用できますmktemp
。構文はオペレーティングシステムによって異なり、以下はOS XおよびおそらくBSDで動作します。
find foo -name '*.html' -type f -exec bash -c 'mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
foo/bar/1.html -> ./1.html.yNr
foo/baz/1.html -> ./1.html.RUu
foo/baz/qux/3.html -> ./3.html.rzu
foo/baz/qux/5.html -> ./5.html.JyW
見つかったすべてのHTMLファイルに対して、bashを起動し、の後-c
にコマンドを実行します。これは実際には、現在のディレクトリにmv
(を使用してmktemp
)動的に作成された宛先ファイル名を持ちます。
意図したとおりに機能することを確認するにはecho
、mv
最初にコマンドをプレビューとして使用できます。
find foo -name '*.html' -type f -exec bash -c 'echo mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
mv -v foo/bar/1.html ./1.html.VNf
mv -v foo/baz/1.html ./1.html.pCW
mv -v foo/baz/qux/3.html ./3.html.ADN
mv -v foo/baz/qux/5.html ./5.html.K3w
ご覧のとおり、すべての呼び出しmktemp
はbash
スクリプトのおかげで異なる接尾辞になります(呼び出し-exec mv
に対して1回評価され、find
移動したすべてに同じ接尾辞を使用するため、その部分を通常に含めることはできません)。
関連するファイルの数に応じて、単なるサフィックスよりも大きいランダムサフィックスが必要になる場合があります.XXX
。