12

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

я сделал

grep abc file-* > out.txt 

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

2 ответа2

25

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

zip archive -@ < out.txt

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

Опция -@ делает чтение zip из STDIN.

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

grep -rl "abc" file-* | zip archive -@
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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .