web-dev-qa-db-ja.com

ファイルのテキストリストからのLinux(mvまたはcp)固有のファイル?

サーバー上に50,000個のPDFやその他のファイルなど、多くのファイルのディレクトリがあります。特定のものを別のディレクトリに移動する必要があります。移動する必要があるファイルのリストをcsvまたは他のテキスト形式で生成できます。

私がする必要があるのは、bashスクリプトを実行して、テキストファイルにリストされているファイルを別のディレクトリに移動またはコピーすることです。

これを行う簡単な方法はありますか?任意の提案やリソースをいただければ幸いです。

36
Jestep

rsyncには、処理するファイルのリストを取得できるいくつかのオプションがあります(--files-from--include-fromなど)。

たとえば、これはトリックを行います:

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つリストされている場合、改行が含まれていない限り、これは有効なファイル名を処理します。

for file in `cat listoffiles`; do mv "$file" /path/of/destination ; done

bashを想定し、さらにlistoffilesには1行に1つのファイルが含まれます。 rsyncルートに対する私の唯一の反対点は、OPがファイルをコピーするのではなく、ファイルを移動する方法を要求することです。 rsyncには王室の結婚式よりも多くのフラグがあるので、それを行うようにさらに変更できると確信していますが、時には単純な方が良いです!

15
MadHatter
rsync --files-from=file_list.txt /path/to/source/ /path/to/dest/

Rsyncには、cpまたはmvコマンドよりも利点があります。これは、Rsyncが存在しない場合にフォルダーを自動的に作成するためです。

5
Paul Wenzel

これは、使用しているテキストファイルの形式によって異なります。たとえば、各ファイルが新しい行に配置されるように記述されたファイルのリストがある場合。次のようにxargsを使用できます。

$ cat your_text_file | xargs cp -t /path/to/destination

また、-execオプションを指定したfindコマンドを使用できます。ファイルをコピー/移動します。

4
Khaled

もしそうである場合に限り、ファイル名に厄介な文字(スペース、改行、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

注-改行が含まれているファイル名が存在する場合、どちらも期待どおりに機能しません。

2

私はrsyncの答えがより良いものだと思いますが、別のオプションのためだけです:

tar -cf - -T FILE_OF_FILENAMES_TO_MOVE.txt |(cd /path/to/new/dir && tar -xvf -)
2
jj33

ディレクトリー全体を移動するのではなく、誤ってディレクトリーのすべての内容を宛先ディレクトリーにコピーしました。これにより、Originディレクトリがディレクトリに追加されるのではなく、目的のディレクトリが雑然としています。

これを修正するために、私は次のことを行いました:

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は必要ない場合があります。これはファイルの権限の問題です)。

これで、元の宛先ディレクトリはすっきりとしていて、雑然としていたすべてのファイルとディレクトリを含む新しいディレクトリが含まれています。

1
John

次のようなものを試してください:

cat list.txt | while read line; do mv "$line" /images; done
0
AliGibbs

ディレクトリ構造を維持しながら、特定のパス(およびすべてのサブディレクトリ)からすべての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/

0