我有一个这样的结构:
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>
。