Durchlaufen Sie Ordner und zählen Sie Dateien in TARs

Durchlaufen Sie Ordner und zählen Sie Dateien in TARs

Ich muss Ordner durchgehen und Dateien mit demselben Namen in TARs zählen.

Ich habe Folgendes versucht:

find -name example.tar -exec tar -tf {} + | wc -l

Aber es schlägt fehl:

tar: ./rajce/rajce/example.tar: Not found in archive
tar: Exiting with failure status due to previous errors
0

Es funktioniert, wenn nur eine example.tar vorhanden ist.

Ich brauche für jede Datei eine separate Nummer.

Danke!

Antwort1

Sie müssen tar -tf {} \;stattdessen jedes Tarball einzeln tar -tf {} +ausführen . In GNU heißt es:tarman find

   -exec command {} +

          This variant of the -exec action runs the specified
          command on the selected files, but the command line is
          built by appending each selected file name at the end;
          the total number of invocations of the command will be
          much less than the number of matched files.  The command
          line is built in much the same way that xargs builds its
          command lines.  Only one instance of `{}' is allowed
          within the com- mand.  The command is executed in the
          starting directory.

Ihr Befehl entspricht tar tf example.tar example.tar. Ihnen fehlt auch [path...]das Argument - einige Implementierungen von find, beispielsweise BSD find, geben find: illegal option -- n einen Fehler zurück. Alles in allem sollte es lauten:

find . -name example.tar -exec tar -tf {} \; | wc -l

Und beachten Sie, dass in diesem Fall wc -ldie Anzahl der example.targefundenen Dateien gezählt wird. Sie können nur nach Dateien im aktuellen Verzeichnis -maxdepth 1suchen . Wenn Sie rekursiv nach allen suchen und die Ergebnisse für jede Datei einzeln ausdrucken möchten (beachten Sie, dass hier einexample.tarexample.tar$Eingabeaufforderung wird verwendet, um den Beginn einer neuen Zeile anzuzeigen, ist nicht Teil des Befehls):

$ find . -name example.tar -exec sh -c 'tar -tf "$1" | wc -l' sh {} \;
3
3

und mit vorangestellten Verzeichnisnamen:

$ find . -name example.tar -exec sh -c 'printf "%s: " "$1" && tar -tf "$1" | wc -l' sh {} \;
./example.tar: 3
./other/example.tar: 3

Antwort2

Ich denke, Ihr Problem liegt in der Verwendung des +Operators für die -execOperation von find. Der +Operator bedeutet „Fügt die Ergebnisse von findzu einer durch Leerzeichen getrennten Liste zusammen und führt den angegebenen Befehl mit dieser Liste als Argument aus“.

Das bedeutet, dass wenn mehr als eine Datei (z. B. zwei) unter verschiedenen Pfaden vorhanden ist example.tar, Ihr -execBefehl folgendermaßen aussieht:

tar -tf /path/1/to/example.tar /path/2/to/example.tar

usw. Das wird jedoch als "schau nach, ob es eine Datei gibt/Pfad/2/zu/beispiel.tarin der TAR-Datei/Pfad/1/zu/beispiel.tar“, was offensichtlich nicht der Fall sein sollte.

Es sollte kein Problem geben, wenn Sie Ihren Code wie folgt ändern:

find -name example.tar -exec tar -tf {} \; | wc -l

tarDadurch wird der Befehl für jede gefundene Datei separat ausgeführt .

verwandte Informationen