Как заархивировать список файлов в Linux

17

У меня есть много файлов, которые мне нужно заархивировать в один каталог. Я не хочу архивировать все файлы в каталоге, а только те, которые соответствуют определенному запросу.

я сделал

grep abc file-* > out.txt 

сделать файл со всеми экземплярами «abc» в каждом файле. Мне нужны сами файлы. Как я могу сказать bash архивировать только эти файлы?

Джон Мангуаль
источник
Подстановочные знаки не работает? Почему? Если я могу спросить ...
Джерран
@jherran Я не хочу архивировать все файлы в каталоге, только те, которые соответствуют определенному запросу. Я сделал, grep abc file-* > out.txtчтобы сделать файл со всеми экземплярами «abc» в каждом файле. Мне нужны сами файлы.
Джон Мэнгуал
Что означает @jherran zip ZipFile.zip file-*, это очевидный способ сделать это. Промежуточный файл вам понадобится только в том случае, если вы используете комплекс findили объединение списков файлов из разных поисков.
AFH

Ответы:

31

Очень просто:

zip archive -@ < out.txt

То есть, если ваш out.txtфайл содержит одно имя файла в строке. Он добавит все файлы из out.txtодного архива под названием archive.zip.

В -@опции делает zipчитать STDIN.

Если вы хотите пропустить создание временного out.txtфайла, вы также можете использовать grepвозможность печати имен файлов. -rвключает рекурсивный поиск (может не потребоваться в вашем случае) и -lпечатает только имена файлов:

grep -rl "abc" file-* | zip archive -@
slhck
источник
Работает хорошо, за исключением того, что у меня есть список файлов, где в именах файлов есть пробелы. Я пытался как экранировать их с помощью ``, так и не экранировать их, один раз в кавычках и один раз без кавычек вокруг имени файла (одна строка - одно имя файла). Пока ничего не получалось.
Томас В.
2
Я заставил его работать с `\` пробелами и без кавычек в файле и следующего:cat out.txt | while read line ; do xargs zip archive.zip $line ; done
Томас В.
если вы хотите заархивировать файлы с похожими именами, попробуйтеzip archive.zip $(ls common_name*)
chepe263
@ chepe263 Это ломается, если файлы имеют пробелы в своем пути. Обычно не рекомендуется анализировать вывод ls.
Slhck
Для любого другого пользователя Mac, который воспользовался здесь любезностью индексации поисковой системы, -@синтаксис опций работает отлично с 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
sancho.s Восстановить Монику
источник