что ты имеешь ввиду найти. -файл _имя _по _удалить _все _серия" *" -удалить
Я не нахожу никакой опции "-файл _имя _до _удалить _все _серии"... вы имеете в виду что-то вроде :-имя имя -из --файлы -я -хочу -в -удалить" *"
с помощью команды find с символом "." (точка )вы заставили его искать в вашем рабочем каталоге. Не могли бы вы уточнить, какие файлы журналов вы пытались удалить?
К сожалению, похоже, что вы удалили открытый ключ... следовательно... ssh невозможен!! Ваше здоровье Франческо
Включение -type f
означает, что это касается только файлов, а не каталогов. Попробуйте удалить эту часть и посмотрите, работает ли она лучше.
И вы можете попробовать удалить | awk '{ print $1 }'
, чтобы убедиться, что эта часть действительно необходима.
Ваша команда подсчитывает только количество строк, выведенных из 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
в квалификаторе zsh
glob ).
Внутри цикла мы проверяем, является ли текущий путь обычным файлом или каталогом, а не символической ссылкой. Если это обычный файл или каталог, мы учитываем его.
В sh
вы должны прибегнуть кfind
:
find documents \( -type f -o -type d \) -exec echo. \; | wc -l
Мы ищем обычные файлы или каталоги в или под documents
, и для каждой такой вещи мы выводим точку на отдельной строке. Затем wc -l
подсчитывает количество созданных строк. Это позволяет избежать многократного подсчета имен файлов со встроенными символами новой строки.
Обратите внимание, что этот вариант также будет учитывать сам каталог documents
.
Самый безопасный способ работы с именами файлов, которые могут содержать пробелы, переводы строк или что-либо еще, — преобразовать каждое имя файла в один безопасный символ (, например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
Для всех файлов и каталогов (, не следующих символическим ссылкам на каталоги ).