パターンに一致するファイルを含むディレクトリを別のディレクトリに移動するには?

パターンに一致するファイルを含むディレクトリを別のディレクトリに移動するには?

階層的なサブディレクトリが複数あり、パターンファイルを含むすべてのディレクトリを新しい親ディレクトリに再配置しようとしています。パターンに一致するファイルに加えてファイルがあるかどうかに関係なく、移動したいディレクトリの内容を保持したいと思います。

たとえば、

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階層ディレクトリではなくターゲットディレクトリのピアになります。subsubdirsubdir

目的の結果が得られなかった場合は削除を試みることができますが、移動されたディレクトリナビゲーションに移動しようとすると-depth多くの種類のエラーが発生します。これは致命的ではありませんが、非常にエレガントではありません。find: ‘subdir’: No such file or directoryfind

それにもかかわらず、ディレクトリをターゲットに移動しようとすると(同じ名前のディレクトリがすでに存在する場合)、エラーが発生します。この場合、何が起こるべきかを指定しなかったので、エラーが発生し、移動が拒否されるだけで十分です。

おすすめ記事