Wie kann ich Dateien mit denselben Pfaden gleichzeitig leeren?

Wie kann ich Dateien mit denselben Pfaden gleichzeitig leeren?

Ich habe eine Struktur wie diese:

Father:
├───Charlie
│    └───lang.log
├───Ava
│    └───lang.log
├───Sophia
│    └───lang.log
...

Ich möchte das Schema aufräumen. Ich versuche:

cat /dev/null > Father/*/lang.log

aber ich habe diesen Fehler:

-bash: */lang.log: mehrdeutige Weiterleitung

Wie kann ich alle Dateien gleichzeitig leeren? Vielleicht mit einem einzigen Befehl.

Antwort1

POSIX-Lösung, einfach:

find Father/ -type f -name lang.log -exec sh -c 'true > "$1"' sh {} \;

… -exec true > {} \;würde nicht funktionieren, die innere Schale wird benötigtwegen Umleitung. Beachten Sie, dass der Shell-Teil nicht ist sh -c 'true > {}', diese Version wärefehlerhaft.


POSIX-Lösung. Sie sollte schneller sein, da shbei vielen übereinstimmenden Dateien weniger Prozesse erzeugt werden:

find Father/ -type f -name lang.log -exec sh -c 'for f; do true > "$f"; done' sh {} +

Wenn Sie truncatedas haben, können viele Operanden verwendet werden (Hinweis: Dies truncateist für POSIX nicht erforderlich):

find Father/ -type f -name lang.log -exec truncate -s 0 -- {} +

--ist hier übertrieben, da in diesem speziellen Fall jeder Pfad, der von kommt, findmit beginnen muss Father/, es besteht keine Gefahr, dass einer davon als Option getarnt wird. Im Allgemeinen --ist es jedoch eine gute Praxis, vor im laufenden Betrieb generierten Operanden zu verwenden.

Antwort2

Eine Möglichkeit hierfür ist die Verwendung von xargs:

find . -name lang.log | xargs -I {} sh -c "cat /dev/null > {}"

Dadurch werden alle Dateien mit diesem Namen gefunden und anschließend für jede einzelne davon ausgeführt cat /dev/null > <filename>.

verwandte Informationen