Ваша find
командная строка не уделяет достаточно внимания пробелам. У вас есть:
find $1 \( -type d -fprintf /tmp/dcount "\n" \) ,\( -type f -fprintf /tmp/fcount"\n" \)
Вам нужен пробел после ,
и еще один перед вторым "\n"
, и вы должны использовать двойные кавычки вокруг $1
:
find "$1" \( -type d -fprintf /tmp/dcount "\n" \) , \( -type f -fprintf /tmp/fcount "\n" \)
Однако GNU find
отклоняет исходную команду с различными ошибками - вам действительно нужно опубликовать точные копии того, что вы выполняете (copy'n'paste неоценим). Не рискуйте перепечатывать его - вы будете совершать глупые ошибки, которые будут выглядеть так, будто вы небрежны.
Вам также не нужны операнды \(
или \)
:
find "$1" -type d -fprintf /tmp/dcount "\n" , -type f -fprintf /tmp/fcount "\n"
Теперь вам нужно решить, стоит ли возиться с временными именами файлов. Вы можете просто написать:
echo "Directory Count $(find "$1" -type d -print | wc -l)"
echo "File Count $(find "$1" -type f -print | wc -l)"
Поскольку временных файлов нет, (a) нет проблем с правами доступа к файлам при записи в такие файлы и (b) вам не нужно удалять их по завершении сценария (или прерывается прерыванием).
Единственным недостатком этого является то, что есть два сканирования иерархии каталогов в "$1"
.
Обратите внимание, что если вы должны сохранить имена файлов , вы должны как минимум использовать .$$
в именах: -fprintf /tmp/dcount.$$
, чтобы гарантировать, что параллельные выполнения программы не мешают друг другу. В целях безопасности (непредсказуемые имена) вы должны использовать:
dcount=$(mktemp /tmp/dcount.XXXXXX)
fcount=$(mktemp /tmp/fcount.XXXXXX)
trap "rm -f $dcount $fcount; exit 1" 0 1 2 3 13 15
find "$1" -type d -fprintf "$dcount" "\n" , -type f -fprintf "$fcount" "\n"
echo "Directory Count" $(wc -l <"$dcount")
echo "File Count" $(wc -l <"$fcount")
rm -f "$dcount" "$fcount"
trap 0