Jak skompresować listę plików w systemie Linux

18

Mam wiele plików, które muszę spakować do jednego katalogu. Nie chcę spakować wszystkich plików w katalogu, ale tylko te pasujące do określonego zapytania.

Zrobiłem

grep abc file-* > out.txt 

aby utworzyć plik ze wszystkimi wystąpieniami „abc” w każdym pliku. Potrzebuję samych plików. Jak mogę powiedzieć bashowi, aby skompresował tylko te pliki?

John Mangual
źródło
Symbole wieloznaczne nie działa? Dlaczego? Jeśli mogę zapytać ...
Jherran
@jherran Nie chcę spakować wszystkich plików w katalogu, tylko te pasujące do określonego zapytania. Zrobiłem grep abc file-* > out.txtplik ze wszystkimi wystąpieniami „abc” w każdym pliku. Potrzebuję samych plików.
John Mangual
@Jherran oznacza zip ZipFile.zip file-*, co jest oczywistym sposobem na zrobienie tego. Plik pośredni byłby potrzebny tylko wtedy, gdy korzystasz z kompleksu findlub konkatenacji list plików z różnych wyszukiwań.
AFH

Odpowiedzi:

33

Bardzo prosty:

zip archive -@ < out.txt

Oznacza to, że jeśli out.txtplik zawiera jedną nazwę pliku w wierszu. Dodaje wszystkie pliki z out.txtjednego archiwum o nazwie archive.zip.

Te -@marki opcja zipodczytu z stdin.

Jeśli chcesz pominąć tworzenie out.txtpliku tymczasowego , możesz również skorzystać grepz możliwości drukowania nazw plików. -rwłącza wyszukiwanie rekurencyjne (może nie być konieczne w twoim przypadku) i -ldrukuje tylko nazwy plików:

grep -rl "abc" file-* | zip archive -@
slhck
źródło
Działa ładnie, z wyjątkiem tego, że mam plik listy, w którym są spacje w nazwach plików. Próbowałem zarówno uciec przed nimi za pomocą znaku `` i nie uciec przed nimi, raz w cudzysłowach i raz bez cudzysłowów wokół nazwy pliku (jedna linia - jedna nazwa pliku). Do tej pory nic nie działało.
Thomas W.
2
Zmusiłem go do pracy ze znakami ucieczki `\ 'i bez cudzysłowów w pliku oraz z następującymi:cat out.txt | while read line ; do xargs zip archive.zip $line ; done
Thomas W.
jeśli chcesz skompresować pliki o podobnych nazwach, możesz spróbowaćzip archive.zip $(ls common_name*)
chepe263
@ chepe263 To się psuje, jeśli pliki mają spacje na ścieżce. Generalnie odradza się analizowanie danych wyjściowych.
slhck
Dla każdego innego na Macu, który znalazł się tutaj dzięki indeksowaniu w wyszukiwarkach, -@składnia opcji działa dobrze od 10.16, mimo że strona podręcznika nadal zawiera język onot on MacOS
Aidan Miles
0

Alternatywy do zaakceptowanej odpowiedzi stąd :

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
sancho.s ReinstateMonicaCellio
źródło