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.


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)


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.


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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.