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:tar
man 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 -l
die Anzahl der
example.tar
gefundenen Dateien gezählt wird. Sie können nur nach Dateien im aktuellen Verzeichnis -maxdepth 1
suchen . Wenn Sie rekursiv nach allen suchen und die Ergebnisse für jede Datei einzeln ausdrucken möchten (beachten Sie, dass hier einexample.tar
example.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 -exec
Operation von find
. Der +
Operator bedeutet „Fügt die Ergebnisse von find
zu 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 -exec
Befehl 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
tar
Dadurch wird der Befehl für jede gefundene Datei separat ausgeführt .