如何同時清空具有相同路徑的檔案?

如何同時清空具有相同路徑的檔案?

我有這樣的結構:

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

我想清理該計劃。我嘗試:

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

但我有這個錯誤:

-bash: */lang.log: 不明確的重定向

如何同時清空所有文件?也許只需一個命令。

答案1

POSIX 解決方案,基本:

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

… -exec true > {} \;不行,需要內殼因為重定向。注意外殼部分不是sh -c 'true > {}',這個版本是有缺陷的


shPOSIX 解決方案,如果有很多匹配文件,由於生成的進程較少,它應該會更快:

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

如果你有truncate可以接受許多操作數(注意truncatePOSIX 不要求):

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

--這裡是多餘的,因為在這種特殊情況下,來自的每條路徑都find必須以 開頭Father/,不存在它們中的任何一個偽裝成選項的風險。然而,一般來說,--在動態產生的運算元之前使用是一種很好的做法。

答案2

一種方法是使用xargs

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

這將找到具有該名稱的任何文件,然後為每個文件運行cat /dev/null > <filename>.

相關內容