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 sh
bei 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 truncate
das haben, können viele Operanden verwendet werden (Hinweis: Dies truncate
ist 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, find
mit 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>
.