階層的なサブディレクトリが複数あり、パターンファイルを含むすべてのディレクトリを新しい親ディレクトリに再配置しようとしています。パターンに一致するファイルに加えてファイルがあるかどうかに関係なく、移動したいディレクトリの内容を保持したいと思います。
たとえば、
homedir/subdir/{file.txt, file.png, file.rtf}
homedir/subdir/{file.txt, file.png}
homedir/subdir/{file.txt, file.jpg}
homedir/subdir/subdir/{file.png, file.png, file.mp3}
「*.png」(およびディレクトリにある可能性のある他のすべての非pngコンテンツ)を含むすべてのディレクトリを/ dirPNGに移動したいと思います。
したがって、結果は次のようになります。
homedir/subdir/{file.txt, file.jpg}
homedir/dirPNG/subdir/{file.txt, file.png, file.rtf}
homedir/dirPNG/subdir/{file.txt, file.png}
homedir/dirPNG/subdir/subdir/{file.png, file.png, file.mp3}
ベストアンサー1
ネストされたバージョンを使用できますfind
。このバージョンでは、andをfind
サポートするGNUまたは同様のエントリが必要です。-maxdepth
-quit
解決策使用することができるPOSIX互換性。
find homedir -depth -type d \
-exec sh -c '[ -n "$(find "$@" -maxdepth 1 -type f -name "*.png" -print -quit)" ]' _ {} \; \
-exec sh -c 'echo "Move $@"' _ {} \;
あるときは交換またはecho "Move $@"
補充してください。mv "$@" /dirPNG
絶対に確実コードが望むことをしています。
まず、ディレクトリを深く探索して*.png
各ディレクトリで一致するファイルを検索するように機能します。一致するものがあれば、ディレクトリが移動されます。
homedir/subdir
したがって、インクルードsubsubdir/a.png
とがある場合は、前に移動してb.png
階層ディレクトリではなくターゲットディレクトリのピアになります。subsubdir
subdir
目的の結果が得られなかった場合は削除を試みることができますが、移動されたディレクトリナビゲーションに移動しようとすると-depth
多くの種類のエラーが発生します。これは致命的ではありませんが、非常にエレガントではありません。find: ‘subdir’: No such file or directory
find
それにもかかわらず、ディレクトリをターゲットに移動しようとすると(同じ名前のディレクトリがすでに存在する場合)、エラーが発生します。この場合、何が起こるべきかを指定しなかったので、エラーが発生し、移動が拒否されるだけで十分です。