Mein Problem (in einem Skript mit #!/bin/sh
) ist wie folgt: Ich versuche, alle Dateien in einem Verzeichnis zu Archivierungszwecken zu überprüfen. Die Prüfsummendatei (in meinem Fall sha1) mit allen Dateinamen sollte sich im selben Verzeichnis befinden. Nehmen wir an, wir haben ein Verzeichnis ~/test
mit Dateien f1
und f2
:.
mkdir ~/test
cd ~/test
echo "hello" > f1
echo "world" > f2
Berechnen Sie nun die Prüfsummen mit
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum
macht genau das, was ich will, listet nur alle Dateien des aktuellen Verzeichnisses auf und berechnet die sha1-Summen (maxdepth kann später geändert werden). Die Ausgabe auf STDOUT ist:
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
Leider beim Versuch, dies in einer Datei mit zu speichern
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum > sums.sha1
Die resultierende Datei zeigt die Prüfsumme für sich selbst an:
da39a3ee5e6b4b0d3255bfef95601890afd80709 sums.sha1
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
und schlägt daher zu einem späteren shasum --check
Zeitpunkt aufgrund des offensichtlichen Problems der zusätzlichen Dateimodifikation beim Speichern der letzten Summe fehl .
Ich habe mich umgesehen und mithilfe von -p
flag for xargs
herausgefunden, dass die Ausgabedatei irgendwie erstellt wird, bevor der Befehl find ausgeführt wird. Daher wird die zusätzliche Datei gefunden und mit einer Prüfsumme versehen ...
Ich weiß, dass ich als Problemumgehung die Prüfsumme an einem anderen Ort speichern könnte (temporäres Verzeichnis über mktemp
) oder sie in find spezifisch ausschließen könnte, aber ich würde gerne verstehen, warum sie sich so verhält, wie sie sich verhält - was in meinen Augen nicht so nützlich ist. Wenn der erste Befehl beispielsweise prüfen würde, ob sich die Ausgabedatei bereits auf der Festplatte befindet, würde er niemals die richtige Antwort erhalten ...
sh
erforderlich sind. Beachten Sie, dass Sie ein Argument benötigen für $0
vor {}
.
tee
ist verschwunden? Ich habe es versucht und es funktioniert gut, ich habe auch STDOUT mit dem Hinzufügen von unterdrückt 1>/dev/null
. War etwas mit der Antwort nicht in Ordnung oder war es ein Fehler?
xargs
, dass die Shell selbst diese Datei erstellt, da die Shell vor der Ausführung eines Befehls zunächst alle Eingaben, Ausgaben und Pipes umleitet, sodassfind
die Ausgabedatei beim Start bereits vorhanden ist. Verwenden Sie-exec
stattdessen:find -maxdepth 1 -type f -exec sh -c 'shasum "$@" > sums.sha1' {} +