Tar eine Liste von Dateien, die nicht alle existieren


10

Ich führe einen Befehl aus einem Skript wie

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

wobei b, c und d möglicherweise nicht existieren und Verzeichnisse sein können. Die Lösungen, die ich mir ausgedacht habe, sind, die Ausgabe von an ls -dzu leiten grep, sie dann in den tarBefehl zu spleißen oder erweiterte Globs für zu aktivieren @(a|b|c|d).

Gibt es eine bessere Möglichkeit, dies zu tun? Ich bin auf Debian Wheezy, die keinen --includeParameter zu haben scheint .


Hast du eine --ignore-failed-readOption?
Costas

1
Versuchte es, gab immer noch einen Fehler für Dateien, die überhaupt nicht existieren.
Gidyn

1
Ja, eine Fehlermeldung ist vorhanden, aber das Archiv wird erstellt.
Costas

Antworten:


8

Du kannst es versuchen

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

wo

  • c zum erstellen
  • f ar.tar Geben Sie die TAR-Datei an

  • $(ls a b c d) listet stdin auf, welche Dateien wirklich vorhanden sind (und gibt Fehler für andere)


2
tar cf ar.tar $(ls -d a b c d 2>/dev/null)funktioniert perfekt .. aber ich denke, es ist sauberer mit extglob
gidyn

Jetzt extglob
portiere

1

Wenn es in Ordnung ist, den vollständigen Pfad der Dateien im Tar-Archiv zu haben, können Sie Folgendes tun:

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

Durch die -eOption zum erneuten Verknüpfen werden vorhandene Dateinamen kanonisiert und andere werden stillschweigend ignoriert.


Ich denke, das könnte funktionieren, wenn ich --strip-componentsbeim Extrahieren.
Gidyn

0

Benutzen

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

Erläuterung

  1. Der erste Parameter ist das Verzeichnis, das Sie durchsuchen möchten.
  2. Standardmäßig finderfolgt die Rekursion.
  3. Das -osteht für -or. Oben bedeutet also, nach diesem oder diesem Platzhalter zu suchen. Wenn Sie nur ein Muster haben, brauchen Sie es nicht -o.
  4. Die Anführungszeichen um das Platzhaltermuster sind erforderlich.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.