Tar список файлов, которые не все существуют


10

Я запускаю команду из сценария, как

tar -c -f ar.tar a b c d

где b, c и d могут не существовать и могут быть каталогами. Решения, которые я придумала, - это передать вывод команды ls -dto grep, затем объединить ее в tarкоманду или включить расширенные глобусы для @(a|b|c|d).

Есть ли более аккуратный способ сделать это? Я нахожусь на Debian Wheezy, у которого, кажется, нет --includeпараметра.


У вас есть --ignore-failed-readвариант?
Костас

1
Пробовал, все равно выдавал ошибку для файлов, которых вообще не существует.
Гыдын

1
Да, сообщение об ошибке присутствует, но архив создан.
Костас

Ответы:


8

ты можешь попробовать

 tar cf ar.tar $(ls a b c d )

где

  • c для создания
  • f ar.tar указать файл tar

  • $(ls a b c d) Укажет стандартному файлу, какой файл действительно присутствует (и выдаст ошибку для другого)


2
tar cf ar.tar $(ls -d a b c d 2>/dev/null)работает отлично .. но я думаю, что это чище с extglob
Gidyn

теперь я портирую скрипт на dash, так что нет extglob- я использую код из моего комментария выше
gidyn

1

Если вы можете указать полный путь к файлам в архиве tar, вы можете сделать следующее:

tar -c -f ar.tar $(readlink -e a b c d)

-eВариант readlink будет канонизировать существующие имена файлов и молча игнорировать любые другие.


Я думаю, это может сработать, если я --strip-componentsпри извлечении
Гыдын,

0

использование

find path/to/dir -name "*.ext1" -o -name "*.ext2"

объяснение

  1. Первый параметр - это каталог, который вы хотите найти.
  2. По умолчанию findрекурсия.
  3. -oОзначает -or. Таким образом, выше означает поиск этого символа или этого. Если у вас есть только один шаблон, то нет необходимости -o.
  4. Кавычки вокруг шаблона подстановки обязательны.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.