Tar listę plików, które nie wszystkie istnieją

10

Uruchamiam polecenie ze skryptu takiego jak

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

gdzie b, cid mogą nie istnieć i mogą być katalogami. Rozwiązania, które wymyśliłem, potokują wyjście ls -ddo grep, następnie łączą go z tarpoleceniem lub włączają rozszerzone globusy dla @(a|b|c|d).

Czy istnieje lepszy sposób na zrobienie tego? Jestem na Debian Wheezy, który nie wydaje się mieć --includeparametru.

gidyn
źródło
Czy masz --ignore-failed-readopcję?
Costas
1
Próbowałem, nadal dawał błąd dla plików, które w ogóle nie istnieją.
gidyn
1
Tak, komunikat o błędzie jest obecny, ale archiwum zostało utworzone.
Costas

Odpowiedzi:

8

możesz spróbować

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

gdzie

  • c do tworzenia
  • f ar.tar określ plik tar

  • $(ls a b c d) wyświetli stdin, które pliki są rzeczywiście obecne (i poda błąd dla innych)

Archemar
źródło
2
tar cf ar.tar $(ls -d a b c d 2>/dev/null)działa idealnie .. ale myślę, że jest czystszy dzięki extglob
gidyn
teraz przenoszę skrypt do dash, więc nie extglob- używam kodu w powyższym komentarzu
gidyn
1

Jeśli posiadanie pełnej ścieżki plików w archiwum tar jest w porządku, możesz:

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

-eOpcja readlink będzie kanonicznej istniejących nazw plików i dyskretnie ignorować żadnych innych.

Anthon
źródło
Myślę, że to może zadziałać, jeśli --strip-componentspodczas wyodrębniania.
gidyn
0

Posługiwać się

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

Wyjaśnienie

  1. Pierwszy parametr to katalog, który chcesz przeszukać.
  2. Domyślnie findrekursja.
  3. -oOznacza -or. Powyżej oznacza poszukiwanie tego symbolu wieloznacznego LUB tego. Jeśli masz tylko jeden wzór, nie ma takiej potrzeby -o.
  4. Cytaty wokół wzoru wieloznacznego są wymagane.
Shital Shah
źródło