Bash-指定した名前のフォルダー内のすべてのファイルを親ディレクトリに再帰的に移動します


0

私はすべてのファイルがカテゴリ名に基づいたフォルダにあるドキュメントライブラリを持っていますが、それらはすべて「pdf」と呼ばれるサブフォルダにもあります。ライブラリ内のすべてのディレクトリをスキャンして、pdfという名前のフォルダ内のすべてのファイルを親ディレクトリに移動する方法はありますか?

回答:


2

以下は、すべてのファイルを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何かを上書きする前に確認を促すために使用します。


どういたしまして。Bashのチュートリアルを求めたので、ここにはいくつかの一般的な問題と、いくつかの落とし穴があります。両方ともGregのBash Wikiにあります-非常に良いリソースです。また、Bash Hackers WikiおよびAdvanced Bash Scripting Guideを
ご覧ください-slhck

1

これが私が考えたことです。最もきれいなものではありませんが、仕様どおりに機能します。

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

2
からfindにパイピングするときはxargs、を使用する必要がありますfind … -print0 | xargs -0 …
slhck

@slhckあなたは正しいです。それを指摘してくれてありがとう。答えを更新しました。

の良いものは、ipathそれについて考えませんでした。私が間違えていなければ$(dirname $(dirname {}))短縮できます"$(dirname {})"/..。(一般に、{}名前にスペースが含まれるファイルなどが複数の引数として表示されるのを防ぐため、引数は引用符でmv
囲む必要

うん、ちょうどそれをテストしました。正常に動作します。"$(dirname {})"/..とてもきれいになります。引用することも考えませんでした。スペースを含むパスは、元のコマンドを中断します。

あなたはDOSを考えています。Unix(など)では、名前にピリオドが含まれる*.*すべてのファイル(のみ)取得します。すべてのファイルを取得するには、単なるプレーンを使用します*(名前ピリオドで始まるファイルを取得できない場合もあります)。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.