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

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

電子ブックが多すぎてかなり複雑です。そのうちのいくつかは独自のディレクトリに単独で存在し、一部は破損しており、一部のディレクトリは空です。このように、さまざまなディレクトリから電子ブックを収集し、すべてを1つのフォルダに配置して読み、再構成するにはどうすればよいですか。私はデフォルトのGNUコマンドまたはbashスクリプトを使用することを好みます。

答え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

ディレクトリツリー(つまり、ディレクトリとそのサブディレクトリで繰り返し)から特定の拡張子を持つすべてのファイルをzshの単一のディレクトリに移動するには、次の手順を実行します。

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

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

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

バッシュから:

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。ハードリンクを使用すると、各ファイルが同時に2つの場所に表示されます。元のファイルまたは新しいファイルが削除されると、他のファイルは残ります。ファイルの両方の場所は同じです。出力の2番目の列の数字がls -l1より大きいため、ファイルにハードリンクがあることがわかります。

シンボリックリンクを作成するには、まずターゲットディレクトリに変更してから(現在のディレクトリを表す)をターゲットとして使用しますln -s.シンボリックリンクは、「そこにあるファイルを見てください」とだけ言うファイルです。シンボリックリンクを削除しても元のファイルは影響を受けません。元のファイルが移動または削除されると、シンボリックリンクがハングアップします(つまり、まだ存在しますが、もはやファイルを指していません)。

ディレクトリの下の空のディレクトリを削除するには、次を使用できます。

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

関連情報