Команда bash find для подсчета файлов не работает - PullRequest
0 голосов
/ 11 октября 2019

Я попытался подсчитать файлы с помощью команды поиска:

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 ]

5 голосов
/ 11 октября 2019

Я бы сделал это так:

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

Или, если GNU find доступен:

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

Но если вы настаиваете на продолжении своей логики - даже если это не такэффективно или практично, вам нужно выполнить подстановку и перенаправление команд в оболочке (см. комментарий Гордона ), например:

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

При таком подходе 3 процесса (sh, cat, expr) для каждого файла создается, и файл создается, а затем обновляется n раз, где n - это количество файлов, что является большой тратой памяти и процессорного времени.
По крайней мере, вы могли бы использовать объемнуюкак:

echo 0 > ct
find aaaa/ -type f -exec sh -c 'expr "$(cat ct)" + "$#" > ct' _ {} +
cat ct
0 голосов
/ 16 октября 2019

Корень проблемы заключается в том, что exec команды find обрабатывает перенаправление '>' как '>>' в последовательных вызовах,Таким образом,

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' \;
...