複数の異なるディレクトリからファイルを収集し、1か所にまとめます

複数の異なるディレクトリからファイルを収集し、1か所にまとめます

非常に整理されていない電子書籍が大量にあります。独自のディレクトリに単独で保存されているものもあれば、破損しているもの、空のディレクトリもあります。これらすべての異なるディレクトリから電子書籍を集めて 1 つのフォルダにまとめ、読んだり整理したりできるようにするにはどうすればよいでしょうか。ネイティブの GNU コマンドまたは bash スクリプトを使用することをお勧めします。

答え1

少なくとも、これらすべてが 1 つの親フォルダの下のさまざまなサブディレクトリにあると想定します。 のようなものです~/mybooks。 そうであれば、次のようにします。

find ~/mybooks -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +

これにより、ディレクトリ.pdfまたはで名前が終わるすべてのファイルまたはディレクトリが検索され、ディレクトリ に移動されます。または で名前が終わるディレクトリがある場合は、ファイルのみを取得するディレクティブを追加します。.epub~/mybooks~/newdir.pdf.epub-type f

find ~/mybooks -type f -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +

答え2

ディレクトリ ツリー (つまり、ディレクトリとそのサブディレクトリを再帰的に) 内の特定の拡張子を持つすべてのファイルを 1 つのディレクトリに移動するには、zsh で次のコマンドを実行します。

mv -i source/**/*.(pdf|epub) destination/

ディレクトリdestinationは既に存在している必要があります。現在のディレクトリとそのサブディレクトリ内のファイルを収集する場合は、この部分を省略できますsource/。名前に関係なくすべてのファイルを移動し、ディレクトリは移動しない場合は、次のようにします。

mv -i source/**/*(.) destination/

bashの場合:

shopt -s extglob globstar
mv -i source/**/*.@(pdf|epub) destination/

これらのコマンドは、ファイル数が多い場合、コマンド ラインが長すぎるというエラー メッセージを表示することがあります。この場合、find再帰的なグロブを使用する代わりに、 を呼び出すことができます。

find source -name '*.pdf' -o -name '*.epub' -exec mv -i -t destination/ {} +
find source -type f -exec mv -i -t destination/ {} +

既存のディレクトリ構造に何らかの情報が含まれている場合は、ファイルを移動する代わりに、ハードリンクまたはシンボリックリンク

ハードリンクを作成するには、lnの代わりにを呼び出しますmv -i。ハードリンクを使用すると、各ファイルは両方の場所に同時に存在します。元のファイルまたは新しいファイルのいずれかを削除しても、もう 1 つは残ります。つまり、ファイルの 2 つの場所は同等です。 の出力の 2 番目の列の数字がls -l1 より大きい場合、ファイルにハードリンクがあることがわかります。

シンボリック リンクを作成するには、まず宛先ディレクトリに変更し、(現在のディレクトリを表す) をターゲットとして呼び出しますln -s.シンボリック リンクは、「代わりにあちらのこのファイルを参照してください」とだけ指示するファイルです。シンボリック リンクを削除しても、元のファイルには影響しません。元のファイルを移動または削除すると、シンボリック リンクはぶら下がり状態になります (つまり、まだそこにありますが、ファイルを指し示さなくなります)。

ディレクトリ下の空のディレクトリを削除するには、

find /some/directory -depth -type d -empty -delete

関連情報