подсчитать количество файлов в каталоге с определенным именем

Я не верю, что есть простой способ отменить то, что вы сделали. Стандартный ответ - восстановить все из вашей последней резервной копии, но не у всех есть резервные копии.

Единственный известный мне вариант - исправить разрешения вручную. Это означает, что вам нужно знать, каковы были исходные разрешения.

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

4
28.05.2019, 11:47
4 ответа

Спасибо людям в комментариях, это ответ на мой вопрос:

ls 2009* | wc -l

или с помощью поиска

find 2009* | wc -l
1
27.01.2020, 20:46

Попытался выполнить следующую команду, все сработало и получило результат

   find. -maxdepth 1 -type f -iname "2009*" | awk '{print NR}'| sed -n '$p'

Примечание. :Если вы хотите также использовать подкаталог, пожалуйста, удалите опцию maxdepth

2
27.01.2020, 20:46

Для подсчета количества файлов, начинающихся с определенного имени файла, с помощью awk.

root@ubuntu$ find. -name "2009*" | awk 'BEGIN{total=0}; {total=total+1} END {print "total files starting with 2009 is ",total}'
total files starting with 2009 is  4
0
27.01.2020, 20:46
set -- 2009*
echo "$#"

Это устанавливает список позиционных параметров ($1, $2,..., и т. д. )на имена, соответствующие 2009*. Длина этого списка составляет $#.


Проблема с ls -1 | wc -l 2009*заключается в том, что вы выполняете wc -lнепосредственно для файлов, соответствующих 2009*, считая количество строк в каждом. Тем временем ls -1пытается записать на стандартный ввод wc, который wcне читает, поскольку ему был предоставлен явный список файлов для работы.

Возможно, вы хотели использовать ls -d 2009* | wc -l. Это перечислило бы все имена, которые соответствуют 2009*(, используя lsс -d, чтобы не перечислять содержимое каталогов ), и подсчитало бы количество строк в выводе. Обратите внимание, что -1не требуется, если вы передаете результат lsкуда-то (, если только lsне является псевдонимом или функцией оболочки, которая принудительно выводит столбец ).

Обратите также внимание, что это даст вам неверный подсчет, если какое-либо имя файла содержит новую строку:

$ touch '2009
> was
> a
> good
> year'
$ ls
2009?was?a?good?year
$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 May 28 11:09 2009?was?a?good?year
$ ls -1
2009?was?a?good?year
$ ls | wc -l
       5
$ ls -1 | wc -l
       5

Однако:

$ set -- 2009*
$ echo "$#"
1

(использование setи вывод $#дополнительно не использует никаких внешних команд в большинстве оболочек)


Использование findдля рекурсивного счета:

find. -type f -name '2009*' -exec echo. \; | wc -l

Здесь мы выводим точку для каждого найденного имени пути в текущем каталоге или под ним, а затем подсчитываем количество строк, которые это создает. Мы не учитываем сами строки имени файла, а делаем это таким образом, чтобы избежать подсчета слишком большого количества строк, если имя файла содержит символы новой строки.

С помощью findмы можем более точно контролировать тип файла, который мы учитываем. Над,мы явно тестируем для обычных файлов с-type f(т.е. не каталоги и другие типы файлов ). Шаблон *в оболочке не различает каталоги и файлы, но оболочка zshможет использовать *(.)для изменения поведения шаблона, чтобы он соответствовал только обычным файлам (пользователь zsh, вероятно, использовал бы 2009*(.)вместо 2009*в вариантах без-findвыше и ниже ).

Использование **в (с shopt -s globstarв bash, или set -o extended-globв yash, или в любой другой оболочке, которая может это поддерживать ), для рекурсивного подсчета:

set -- **/2009*
echo "$#"

Шаблон **соответствует почти как *, но также соответствует /в путях.

10
27.01.2020, 20:46

Теги

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