Подсчет количества подкаталогов и файлов в 'documents/'

что ты имеешь ввиду найти. -файл _имя _по _удалить _все _серия" *" -удалить

Я не нахожу никакой опции "-файл _имя _до _удалить _все _серии"... вы имеете в виду что-то вроде :-имя имя -из --файлы -я -хочу -в -удалить" *"

с помощью команды find с символом "." (точка )вы заставили его искать в вашем рабочем каталоге. Не могли бы вы уточнить, какие файлы журналов вы пытались удалить?

К сожалению, похоже, что вы удалили открытый ключ... следовательно... ssh невозможен!! Ваше здоровье Франческо

3
19.10.2019, 15:45
3 ответа

Включение -type fозначает, что это касается только файлов, а не каталогов. Попробуйте удалить эту часть и посмотрите, работает ли она лучше.

И вы можете попробовать удалить | awk '{ print $1 }', чтобы убедиться, что эта часть действительно необходима.

2
27.01.2020, 21:17

Ваша команда подсчитывает только количество строк, выведенных из find. Команда findвыводит только пути к обычным файлам в каталоге documentsили в нем.

Если вы хотите подсчитать количество обычных файлов и каталогов в вашем каталоге documentsили под ним, вы можете сделать это в оболочке zsh:

set -- documents/**/*(DN/) documents/**/*(DN.)
printf 'There are %d regular files and directories in or under "documents"\n' "$#"

Это устанавливает позиционные параметры ($1, $2и т. д. )на результат расширения двух шаблонов подстановки имен файлов documents/**/*(DN/)и documents/**/*(DN.), первый из которых будет соответствовать всем обычным файлы, в то время как второй соответствует каталогам (независимо от того, скрыты они или нет ). Шаблон **"рекурсивно" сопоставляется с подкаталогами.

После установки позиционных параметров специальная переменная $#будет содержать количество этих параметров.

В оболочке bash, которая не поддерживает квалификаторы glob(DN/)и (DN.), вы можете использовать цикл:

shopt -s globstar dotglob nullglob

count=0
for pathname in documents/**/*; do
    if [[ -f $pathname ]] || [[ -d $pathname ]]; then
       [[ ! -h $pathname ]] && count=$(( count + 1 ))
    fi
done

printf 'There are %d regular files and directories in or under "documents"\n' "$count"

Это немного сложнее, чем вариант zsh, но за ним легко следить. Сначала мы устанавливаем ряд опций оболочки, чтобы мы могли использовать **, чтобы мы считали скрытые имена и чтобы шаблон не разрешался, если нет совпадений (эти последние два равны Dи Nв квалификаторе zshglob ).

Внутри цикла мы проверяем, является ли текущий путь обычным файлом или каталогом, а не символической ссылкой. Если это обычный файл или каталог, мы учитываем его.

В shвы должны прибегнуть кfind:

find documents \( -type f -o -type d \) -exec echo. \; | wc -l

Мы ищем обычные файлы или каталоги в или под documents, и для каждой такой вещи мы выводим точку на отдельной строке. Затем wc -lподсчитывает количество созданных строк. Это позволяет избежать многократного подсчета имен файлов со встроенными символами новой строки.

Обратите внимание, что этот вариант также будет учитывать сам каталог documents.

2
27.01.2020, 21:17

Самый безопасный способ работы с именами файлов, которые могут содержать пробелы, переводы строк или что-либо еще, — преобразовать каждое имя файла в один безопасный символ (, напримерX).

С помощью find мы можем выполнить команду для каждого найденного файла/каталога:

find documents/ -type f -exec printf X \; ; echo

Будет сгенерирована строка с таким количеством X, сколько файлов (измените fна dдля подсчета каталогов ). Чтобы преобразовать это в число, мы можем зафиксировать результат команды и вывести размер полученной строки:

$ str="$(find documents -type d -exec printf X \;)"
$ echo "${#str}"
23

Или напрямую считать байты (, равные символам, поскольку используется только один символX):

$ find testit -type d -exec printf X \; | wc -c

Команда find считает точечные -файлы и может переходить по символическим ссылкам (с -L )или без (по умолчанию ). Если избегать файлов с точками -и переходить по символическим ссылкам (на файлы, а не на каталоги, поскольку bash 4.3 )по умолчанию не является проблемой, мы можем использовать подстановку

$ ( shopt -s globstar; set -- documents/**/*/; echo "$#" )
23

Для каталогов и:

$ ( shopt -s globstar; set -- documents/**/*; echo "$#" )
65

Для всех файлов и каталогов (, не следующих символическим ссылкам на каталоги ).

0
27.01.2020, 21:17

Теги

Похожие вопросы