私は多くのファイルのディレクトリを持っています。50,000pdfのようなものとサーバー上の他のファイルです。特定のものを別のディレクトリに移動する必要があります。csvまたは他のテキスト形式で移動する必要があるファイルのリストを生成できます。
必要なのは、bashスクリプトを実行して、テキストファイルにリストされているファイルを別のディレクトリに移動またはコピーすることです。
これを行う簡単な方法はありますか?提案やリソースは大歓迎です。
私は多くのファイルのディレクトリを持っています。50,000pdfのようなものとサーバー上の他のファイルです。特定のものを別のディレクトリに移動する必要があります。csvまたは他のテキスト形式で移動する必要があるファイルのリストを生成できます。
必要なのは、bashスクリプトを実行して、テキストファイルにリストされているファイルを別のディレクトリに移動またはコピーすることです。
これを行う簡単な方法はありますか?提案やリソースは大歓迎です。
回答:
rsyncのは、プロセスへのファイルのリストを取ることができますいくつかのオプション(持っている--files-from
、--include-from
など)。
たとえば、これはトリックを行います:
rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
の無駄な使用を避けるためcat
(および使用しない場合rsync
):
xargs -a file_list.txt mv -t /path/to/dest
ファイルに改行が含まれていない限り、ファイルが1行に1つずつリストされている場合、これは有効なファイル名を処理します。
mv
同じ宛先ディレクトリに折りたたまれることです。rsync
受け入れられた答えのアプローチは、この制限を受けません。
for file in `cat listoffiles`; do mv "$file" /path/of/destination ; done
bashを前提とし、さらにlistoffiles
1行に1つのファイルが含まれます。rsyncルートに対する私の唯一の異議は、OPがファイルをコピーするのではなく、ファイルを移動する方法を要求することです。rsyncには王室の結婚式よりも多くのフラグがあるので、それを行うためにさらに変更できると確信していますが、時にはシンプルな方が良い場合もあります!
while read -r file; do mv "$file" /path/of/destination ; done < listoffiles
rsync --files-from=file_list.txt /path/to/source/ /path/to/dest/
Rsyncには、フォルダが存在しない場合に自動的に作成されるため、cp
or mv
コマンドよりも利点があります。
/path/to/source
ファイルリストからパスを取得するときになぜ必要なのですか?
ディレクトリ全体を移動するのではなく、ディレクトリの内容全体を宛先ディレクトリに誤ってコピーしました。これにより、元のディレクトリがディレクトリに追加される代わりに、混乱した宛先ディレクトリが作成されました。
これを修正するために、次のことを行いました。
ls -rt /path/to/cluttered/destination/directory/ > /opt/dircheck/filestomove
上記のコマンドは、宛先ディレクトリのすべてのコンテンツのリストであるfilestomoveファイルを作成します。このファイルは、時間で逆にソートされ、最も古いものから最新のものを意味します。
次に、物を移動するために、混乱している宛先ディレクトリのサブディレクトリを作成しました。
mkdir /path/to/cluttered/destination/directory/newsubdirectory
次に、画面へのリスト表示と詳細の表示を除き、ディレクトリのリスト表示を繰り返しました。
ls -lrht /path/to/cluttered/destination/directory/
この行は、日付の昇順(時間による逆順)でソートされたディレクトリをリストし、現在の混乱した宛先ディレクトリ内の各ファイルの日付/タイムスタンプを含む詳細情報を表示します。私はこれを参照し、先頭から始めて、どのディレクトリとファイルをどこに保存したいかを示します。すべての新しいファイルが開始されるはずのファイルの日付/時刻スタンプにギャップがあり、そこにあるべきではありません。
次に、上記の最初の手順で作成された(日付で並べ替えられた)filestomoveファイルを編集し、元のディレクトリに残したい以前のリストからいくつかを削除しました。
vim /opt/dircheck/filestomove
移動したくないすべてのファイルを上部から削除します。
次に、この投稿で前述したコマンドを使用して、リスト内のファイルを作成した新しいディレクトリに移動しました。
sudo xargs -a /opt/dircheck/filestomove mv -t /path/to/cluttered/destination/directory/newsubdirectory
これにより、すべてのファイルが一瞬で移動しました。(注:最初にsudoが必要ない場合がありますが、これはファイル許可の問題です)。
これで、元の宛先ディレクトリはきれいできれいになり、散らかっていたすべてのファイルとディレクトリを含む新しいディレクトリが含まれています。
ファイル名に厄介な文字(スペース、改行、xargsを個々の引数に分割する方法を混乱させる)がない場合(のみ)、改行(1つのファイル)で区切られたファイルのリストを生成します行ごと)、あなたは次のようなことをすることができます。
cat filenames.txt | xargs mv -t /path/to/move/files/to
(一般的に、man xargsを参照してください、それは素晴らしいです)
特定のmvに-tオプションがない場合は、次のようなトリックもできます。
( cat filenames.txt; echo; echo /path/to/move/files/to ) | xargs mv
注-ファイル名に改行が含まれている場合、これらのいずれも期待どおりに機能しません。
(cat filenames.txt; echo; echo /path/to/move/files/to) | xargs mv
ディレクトリ構造を維持しながら、特定のパス(およびすべてのサブディレクトリ)からすべてのPNGファイルを新しい場所にコピーする必要がある場合、次のように機能しました。
rsync -av --prune-empty-dirs --include='*/' --include='*.png' --exclude='*' source/ destination/
RSYNCは最初にディレクトリ構造のミラーを作成してからファイルを同期するので、空の余分なフォルダーができてしまいます。--prune-empty-dirsフラグを使用して、これらの空のディレクトリを削除しました。
私は所属していませんが、このソリューションに影響を与えたソースに信用を与えるのは正しいと考えました:http : //techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/