Как архивировать файлы под определенным каталогом, которые не являются текстовыми файлами в Mac OS? - PullRequest
1 голос
/ 16 марта 2011

Эй, ребята, я использовал команду zip, но я хочу заархивировать только все файлы, кроме * .txt. Например, если две директории file1, file2; у обоих есть несколько * .txt файлов. Я хочу архивировать только нетекстовые файлы из файла1 и файла2.

tl; dr: Как заставить linux выдавать мне все файлы, которые не соответствуют * .txt

Ответы [ 3 ]

4 голосов
/ 16 марта 2011
$ zip -r zipfile -x'*.txt' folder1 folder2 ...
0 голосов
/ 16 марта 2011

Простой, используйте опцию bash Extended Glob, например:

#!/bin/bash

shopt -s extglob

zip -some -options !(*.txt)

Редактировать

Это не так хорошо, как встроенная опция -x для zip, но мое решение универсально для любой команды, которая может не иметь этой приятной функции.

0 голосов
/ 16 марта 2011

Перейдите в нужный каталог и запустите:

ls | grep -P '\.(?!txt$)' | zip -@ zipname

Это создаст файл zipname.zip, содержащий все, кроме файлов .txt.Короче говоря, он выполняет следующие действия:

  1. Список всех файлов в каталоге, по одному на строку (это может быть достигнуто с помощью параметра -1, однако здесь это не нужно, так как это значение по умолчаниюкогда вывод не является терминалом, в данном случае это канал).
  2. Извлеките из него все строки, которые не заканчиваются на .txt.Обратите внимание, что grep использует регулярное выражение Perl (опция -P), поэтому можно использовать отрицательный прогноз.
  3. Извлечь список из stdin (-@) в zipname файл.1020 *

    Обновление

    Первый опубликованный мной метод не работает с файлами с двумя ., как я описал в комментариях.Однако по какой-то причине я забыл о опции -v для grep, которая печатает только то, что не не соответствует регулярному выражению.Кроме того, добавьте опцию без учета регистра.

    ls | grep -vi '\.txt$' | zip -@ zipname
    
...