我怎样才能同时清空相同路径的文件?

我怎样才能同时清空相同路径的文件?

我有一个这样的结构:

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>

相关内容