Я не верю, что есть простой способ отменить то, что вы сделали. Стандартный ответ - восстановить все из вашей последней резервной копии, но не у всех есть резервные копии.
Единственный известный мне вариант - исправить разрешения вручную. Это означает, что вам нужно знать, каковы были исходные разрешения.
Вы можете создать нового пользователя, переключиться на него, настроить программное обеспечение и темы, которые вы хотите использовать, а затем сравнить права доступа к файлам в новом каталоге пользователя с разрешениями файлов в старом каталоге, и починить старую.
Спасибо людям в комментариях, это ответ на мой вопрос:
ls 2009* | wc -l
или с помощью поиска
find 2009* | wc -l
Попытался выполнить следующую команду, все сработало и получило результат
find. -maxdepth 1 -type f -iname "2009*" | awk '{print NR}'| sed -n '$p'
Примечание. :Если вы хотите также использовать подкаталог, пожалуйста, удалите опцию maxdepth
Для подсчета количества файлов, начинающихся с определенного имени файла, с помощью 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
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 "$#"
Шаблон **
соответствует почти как *
, но также соответствует /
в путях.