bash find命令用于计数文件不起作用

时间:2019-10-11 08:23:17

标签: bash find

我尝试使用find命令对文件进行计数:

echo "0" > ct
find aaaa/ -type f -exec expr $(cat ct) + 1 > ct \;
cat ct
1
1
1
1

如果我手动执行它,它将正常工作:

echo "0" > ct
expr $(cat ct) + 1 > ct
expr $(cat ct) + 1 > ct
expr $(cat ct) + 1 > ct
expr $(cat ct) + 1 > ct
cat ct
4

2 个答案:

答案 0 :(得分:5)

我会这样:

find aaaa/ -type f -exec printf '%.s.' {} + | wc -c

或者如果GNU查找可用:

find aaaa/ -type f -printf '.' | wc -c

但是,如果您坚持要遵循自己的逻辑(即使它不起作用或不实用),则需要在shell中进行命令替换和重定向(请参见Gordon's comment),例如:

echo 0 > ct
find aaaa/ -type f -exec sh -c 'expr "$(cat ct)" + 1 > ct' \;
cat ct

使用这种方法,将为每个文件生成3个进程(sh,cat,expr),并创建一个文件,然后将其更新n次,其中n是文件数,这是对内存和CPU的极大浪费时间。
至少您可以使用批量执行程序,例如:

echo 0 > ct
find aaaa/ -type f -exec sh -c 'expr "$(cat ct)" + "$#" > ct' _ {} +
cat ct

答案 1 :(得分:0)

问题的根源在于以下事实:find命令的 exec '>'重定向视为'>>'在连续的通话中。 因此

find aaaa/ -type f -exec echo "xxxx" > file.txt \;

工作方式:

echo "xxxx" > file.txt
echo "xxxx" >> file.txt
...
echo "xxxx" >> file.txt

解决方法是使用 sh (如oguz ismail建议):

find aaaa/ -type f -exec sh -c 'echo "xxxx" > file.ct' \;