我有這樣的結構:
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 > {}'
,這個版本是有缺陷的。
sh
POSIX 解決方案,如果有很多匹配文件,由於生成的進程較少,它應該會更快:
find Father/ -type f -name lang.log -exec sh -c 'for f; do true > "$f"; done' sh {} +
如果你有truncate
可以接受許多操作數(注意truncate
POSIX 不要求):
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>
.