Найти zip-файлы во всех каталогах, но исключить некоторые папки

Как указал steeldriver, проблема заключалась в том, что tarполучил не только файлы в каталоге, но и сам каталог. Поведение по умолчанию tarзаключается в рекурсии по каталогам, поэтому каждая запись в каталоге была добавлена ​​во второй раз (один раз путем явного предоставления файлов и один раз путем рекурсии через явно указанный каталог ). Решение: либо (1 ), чтобы не указывать каталоги, либо (2 ), чтобы отключить рекурсию.

Первый будет выглядеть так:

$ find tmp -type f -print0 | sort -z | tar --null -T - -cvvf tmp.tar
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/1
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/2
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/3

Второй случай (, который мне нужен, поскольку я хочу воспроизвести полную вложенную структуру каталогов ), заключается в простом отключении рекурсии:

$ find tmp -print0 | sort -z | tar --no-recursion --null -T - -cvvf tmp.tar
drwxr-xr-x usr/grp     0 2019-05-02 17:06 tmp/
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/1
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/2
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/3
1
25.01.2021, 16:59
2 ответа
find. -path './composer*' -prune -o -iname '*.zip' -print

Хотя это не будет перечислять ./composer-foo.ZIP, например.

Для этого вы могли бы сказать это:

find. '(' ! -path './composer*' -o -prune ')' -iname '*.zip'

-pruneговорит findне спускаться в каталог, поэтому вы хотите применить это к каталогам, которые вы хотите заскриптовать. и -printфайлы, которые вы хотите отобразить в списке (обратите внимание, что если предикат действия не указан (и -pruneявляется не предикатом действия ), неявным -printдействием добавляется для файлов, которые соответствуют целому выражению ).

Но здесь похоже, что вы хотите пропустить каталоги, которые называются .composer, где бы они ни находились, а не прямые подкаталоги -текущего рабочего каталога, имя которого начинается с composer, так что это просто быть:

find. -name.composer -prune -o -iname '*.zip' -print

Или также пропустить каталоги с именемvendor:

find. '(' -name.composer -o -name vendor ')' -prune \
       -o -iname '*.zip' -print
4
18.03.2021, 22:34

Вы можете использовать флаг -v команды grep, чтобы исключить нежелательные результаты:

# find /home -iname *.zip|grep -v "./composer"|grep -v "vendor/"
0
18.03.2021, 22:34

Теги

Похожие вопросы