私はすべてのファイルがカテゴリ名に基づいたフォルダにあるドキュメントライブラリを持っていますが、それらはすべて「pdf」と呼ばれるサブフォルダにもあります。ライブラリ内のすべてのディレクトリをスキャンして、pdfという名前のフォルダ内のすべてのファイルを親ディレクトリに移動する方法はありますか?
私はすべてのファイルがカテゴリ名に基づいたフォルダにあるドキュメントライブラリを持っていますが、それらはすべて「pdf」と呼ばれるサブフォルダにもあります。ライブラリ内のすべてのディレクトリをスキャンして、pdfという名前のフォルダ内のすべてのファイルを親ディレクトリに移動する方法はありますか?
回答:
以下は、すべてのファイルをpdfフォルダから親ディレクトリに移動します。
find ~/some/folder -type d -name 'pdf' -print0 | while IFS= read -d '' dir
do
find "$dir" -type f -maxdepth 1 -exec echo mv -- {} "$dir"/.. \;
done
echo必要なことを実行したことが確認できたら削除します。
これにより、親に同じ名前のファイルが既に含まれているかどうかを確認せずにファイルが上書きされることに注意してください。mv -i何かを上書きする前に確認を促すために使用します。
これが私が考えたことです。最もきれいなものではありませんが、仕様どおりに機能します。
find . -ipath "*pdf/*.pdf" -type f -print0 | xargs -0 -I{} sh -c 'mv "{}" "$(dirname "{}")"/..'
サブフォルダ内の.pdfファイルのみをpdf対応する親ディレクトリに移動します。コマンドを変更してサブフォルダー内のすべてのファイルを移動pdfするには、ipath引数をに調整します*pdf/*。
$ find .
.
./category1
./category1/other_dir
./category1/other_dir/c1o1.txt
./category1/pdf
./category1/pdf/c1p1.pdf
./category1/pdf/c1p2.pdf
./category1/pdf/c1p3.pdf
./category2
./category2/other_dir
./category2/other_dir/c2o1.txt
./category2/pdf
./category2/pdf/c2p1.pdf
./category2/pdf/c2p2.pdf
./category2/pdf/c2p3.pdf
$ find . -ipath "*pdf/*.pdf" -type f -print0 | xargs -0 -I{} sh -c 'mv "{}" "$(dirname "{}")"/..'
.
./category1
./category1/c1p1.pdf
./category1/c1p2.pdf
./category1/c1p3.pdf
./category1/other_dir
./category1/other_dir/c1o1.txt
./category1/pdf
./category2
./category2/c2p1.pdf
./category2/c2p2.pdf
./category2/c2p3.pdf
./category2/other_dir
./category2/other_dir/c2o1.txt
./category2/pdf
findにパイピングするときはxargs、を使用する必要がありますfind … -print0 | xargs -0 …。
ipathそれについて考えませんでした。私が間違えていなければ$(dirname $(dirname {}))短縮できます"$(dirname {})"/..。(一般に、{}名前にスペースが含まれるファイルなどが複数の引数として表示されるのを防ぐため、引数は引用符でmv
"$(dirname {})"/..とてもきれいになります。引用することも考えませんでした。スペースを含むパスは、元のコマンドを中断します。
*.*すべてのファイルを(のみ)取得します。すべてのファイルを取得するには、単なるプレーンを使用します*(名前がピリオドで始まるファイルを取得できない場合もあります)。