ディレクトリ(およびそのサブディレクトリ)内のすべてのpdfファイルを単一の出力ディレクトリに再帰的にコピーするにはどうすればよいですか?


20

多数のPDFファイルを含むディレクトリがありますが、その一部はサブディレクトリにあります(いくつかの階層を拡張できます)。一致するすべてのファイルを*.pdfという名前の単一の出力フォルダーに移動しますpapers

これどうやってするの?


1
2つのファイルa/x.pdfとが存在するケースをどのように処理しますb/x.pdfか?
パニック大佐

回答:



30
  find /bunchopdfs -name "*.pdf" -exec mv {} /papers \;    

これが私がしたテストです

$ ls -R
.:
a  aaa bbb.pdf  pdfs

./a:
foo.pdf

./pdfs:

ファイル「aaa bbb.pdf」に注意してください。

$ find . -name "*pdf" -exec mv {} pdfs \;
$ ls -R
.:
a  pdfs

./a:

./pdfs:
aaa bbb.pdf  foo.pdf

綺麗な!+1!
PenguinCoder

"{}"スペースを含むファイル名を処理するために引用する必要はありませんか?
テルドン

@terdon:実際、そうではありません(ただし、この種の問題は時々私を捕まえます)。更新された回答を参照してください。
RedGrittyBrick

4
find -print0 /directory/with/pdfs -iname "*.pdf" | xargs -0 mv -t /papers

(別の答えに似ていますが、私はpipe / xargs / mvを好む...私にとってより直感的です)

参考までに、複数のディレクトリと複数のpdfファイルで上記の1行のスクリプトを正常に実行しました。


1
xargsには、-execにはない「ファイル名のスペース」の問題があります。find -print0-0xargsにargs を追加することで、これを多少仲介できます。
リッチホモルカ

@RichHomolkaは変更された答えを見る。(ヒントをありがとう。それは本当に便利です!)
トレバーボイドスミス

試したことはありますか?findコマンドの最後に「-print0」を追加する必要があるようです
-tollo

0

Windowsコマンドライン(cmd.exe)の場合、次を使用できます。

for /F "usebackq delims==" %j IN (`dir /s /b *.pdf`) do copy "%j" c:\target_dir

1
こんにちは、SUへようこそ。答えてくれてありがとう、しかし質問は特にLinuxソリューションを要求している。
テルドン

2
ウィンドウがそれを行うことができることはまだ素晴らしいです!
ヴォラック

0

1つのディレクトリだけを深く検索する場合は、次のようにします。

mkdir <destination>
mv */*.pdf <destination>

ここで<destination>、いくつかのディレクトリを表します。mv自動的にディレクトリを作成することはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.