私はすべてのファイルがカテゴリ名に基づいたフォルダにあるドキュメントライブラリを持っていますが、それらはすべて「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 {})"/..
とてもきれいになります。引用することも考えませんでした。スペースを含むパスは、元のコマンドを中断します。
*.*
すべてのファイルを(のみ)取得します。すべてのファイルを取得するには、単なるプレーンを使用します*
(名前がピリオドで始まるファイルを取得できない場合もあります)。