Позначте список файлів, які не всі існують


10

Я запускаю команду з подібного сценарію

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

де b, c і d можуть не існувати, і можуть бути каталогами. Я запропонував рішення, як підключити висновок ls -dдо grep, а потім з'єднати його з tarкомандою або ввімкнути розширені глобуси для @(a|b|c|d).

Чи є акуратніший спосіб зробити це? Я на Debian Wheezy, у якого, схоже, немає --includeпараметра.


У вас є --ignore-failed-readваріант?
Костас

1
Спробував це, все-таки видав помилку для файлів, які взагалі відсутні.
gidyn

1
Так, повідомлення про помилку присутнє, але створено архів.
Костас

Відповіді:


8

Ви можете спробувати

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

де

  • c для створення
  • f ar.tar вкажіть файл tar

  • $(ls a b c d) перелічить в stdin, який файл дійсно присутній (і дасть помилку для інших)


2
tar cf ar.tar $(ls -d a b c d 2>/dev/null)працює чудово .. але я думаю, що це чистіше з extglob
gidyn

тепер я переношу сценарій на тире, так що ні extglob- я використовую код у своєму коментарі вище
gidyn

1

Якщо нормально мати повний шлях файлів до архіву tar, ви можете зробити:

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

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


Я думаю, це може спрацювати, якщо я --strip-componentsпід час видобутку.
gidyn

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.