Как указал 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
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
Вы можете использовать флаг -v команды grep, чтобы исключить нежелательные результаты:
# find /home -iname *.zip|grep -v "./composer"|grep -v "vendor/"