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


34

私は多くのファイルのディレクトリを持っています。50,000pdfのようなものとサーバー上の他のファイルです。特定のものを別のディレクトリに移動する必要があります。csvまたは他のテキスト形式で移動する必要があるファイルのリストを生成できます。

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

これを行う簡単な方法はありますか?提案やリソースは大歓迎です。


また、ファイルはディレクトリに追加されるときにランダムに名前が付けられます。特定のファイルを移動するために使用できる命名規則やロジックはありません。
ジェステップ

回答:


26

rsyncのは、プロセスへのファイルのリストを取ることができますいくつかのオプション(持っている--files-from--include-fromなど)。

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

rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory

2
例:rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
anneb

28

の無駄な使用を避けるためcat(および使用しない場合rsync):

xargs -a file_list.txt mv -t /path/to/dest

ファイルに改行が含まれていない限り、ファイルが1行に1つずつリストされている場合、これは有効なファイル名を処理します。


2
この方法の欠点の1つは、リスト内のファイルにパス名が含まれている(つまり、すべてが同じディレクトリにない)場合、使用するとすべてのファイルがmv同じ宛先ディレクトリに折りたたまれることです。rsync受け入れられた答えのアプローチは、この制限を受けません。
ジェイソンR

また、私は、このコマンドを試してみましたが、xargsが単一引用符(「比類のない単一引用符」)に含まれる任意のファイルに壊れる
ジェームズBeninger

同じターゲットディレクトリ内の異なるソースパスのファイルが実際に必要だったので、これはうまくいきました。
PseudoNoise

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

bashを前提とし、さらにlistoffiles1行に1つのファイルが含まれます。rsyncルートに対する私の唯一の異議は、OPがファイルをコピーするのではなく、ファイルを移動する方法を要求することです。rsyncには王室の結婚式よりも多くのフラグがあるので、それを行うためにさらに変更できると確信していますが、時にはシンプルな方が良い場合もあります!


1
このソリューションは、最も柔軟であると思います。相対ファイルパスオプションが必要なため、cpまたはmvの代わりにrsyncを使用してしまいました。
スパムウィッチ

4
ニース、ちょうどスペースに問題があったので、それを次のように変更しましたwhile read -r file; do mv "$file" /path/of/destination ; done < listoffiles
。– user1182474

1
@ user1182474ありがとう、そして入力リダイレクトのエレガントな使用。答えに満足を示す従来の方法は、ところで投票することです!
MadHatterは、モニカをサポートします

1
@ user1182474ありがとうございます!多くの変更の最後のステップでは、OSXバックアップユーティリティをAndroidに移植するために、やみくもにやらなければなりませんでした。
チャーリーゴリチャーナズ16

4

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

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

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


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

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


/path/to/sourceファイルリストからパスを取得するときになぜ必要なのですか?
bzero

@bzeroファイルのリストには相対パスを含めることができますか?
DreadfulWeather

2

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

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

tarはubuntuベースイメージで使用できますが、rsyncでは使用できないため、これはDockerfileに適しています。
クリスチャンプ

1

ディレクトリ全体を移動するのではなく、ディレクトリの内容全体を宛先ディレクトリに誤ってコピーしました。これにより、元のディレクトリがディレクトリに追加される代わりに、混乱した宛先ディレクトリが作成されました。

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

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

ファイル名に厄介な文字(スペース、改行、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

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


しかしながら; Ignacioの回答を参照してください。rsyncはこのようなもののために作られたものです。
はKjetil Joergensen

cpmvなどを持っていない-t上のオプションBSD s「を、そしてサブシェルとの第二の例は、私のための仕事(しませんでした/path/to/move最後のファイル名として追加されます)

1
@ w17t-filenames.txtが改行で終わらないように聞こえるか、filenames.txtの最後に改行を追加するか、次のようにします(cat filenames.txt; echo; echo /path/to/move/files/to) | xargs mv
Kjetil Joergensen

0

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

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

while read line; do mv $line /images; done < list.txt 単一のコマンドとしての可能性があります
イグニブ

0

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

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