Linuxでファイルのリストを圧縮する方法


17

1つのディレクトリにzip圧縮する必要があるファイルがたくさんあります。ディレクトリ内のすべてのファイルを圧縮するのではなく、特定のクエリに一致するファイルのみを圧縮します。

やった

grep abc file-* > out.txt 

各ファイルに「abc」のすべてのインスタンスを含むファイルを作成します。ファイル自体が必要です。これらのファイルのみを圧縮するようにbashに指示するにはどうすればよいですか?


ワイルドカードは機能しませんか?どうして?私が尋ねることができれば...
jherran

@jherranディレクトリ内のすべてのファイルを圧縮するのではなく、特定のクエリに一致するファイルのみを圧縮します。私がやったgrep abc file-* > out.txtすべてのファイルを作成するインスタンスごとのファイルの「ABC」の。ファイル自体が必要です。
ジョンマングアル14年

@jherranの意味はzip ZipFile.zip file-*、それを行う明白な方法です。find異なる検索からのファイルリストの複合または連結を使用している場合にのみ、中間ファイルが必要になります。
AFH 14年

回答:


31

非常に簡単:

zip archive -@ < out.txt

つまり、out.txtファイルに1行に1つのファイル名が含まれている場合です。というすべてのファイルをout.txtという1つのアーカイブに追加しますarchive.zip

この-@オプションはzip、STDINから読み取りを行います。

一時out.txtファイルの作成をスキップする場合は、grepの機能を使用してファイル名も印刷できます。-r再帰検索を有効にし(あなたの場合は必要ないかもしれません)、-lファイル名のみを出力します:

grep -rl "abc" file-* | zip archive -@

ファイル名にスペースが含まれるリストファイルがあることを除いて、うまく機能します。私は両方とも「でエスケープし、エスケープしないで、一度引用符で囲み、ファイル名の周りに引用符なしで1回試しました(1行-1ファイル名)。今のところ何も機能していません。
トーマスW.

2
ファイルに引用符を使用せずに、エスケープされたスペース「\」で動作するようにしました。cat out.txt | while read line ; do xargs zip archive.zip $line ; done
Thomas W.

同様の名前のファイルをzip archive.zip $(ls common_name*)
圧縮

@ chepe263これは、ファイルのパスにスペースが含まれていると壊れます。通常、ls出力を解析することはお勧めしません。
slhck

ここで巻き上げられ、検索エンジンのインデックスの礼儀Mac上で他の誰のために、-@オプションの構文は、manページはまだについての言語が含まれていても、10.16のよう罰金に動作しますnot on MacOS
エイダンマイル

0

ここから受け入れられる答えの代替案:

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