У меня есть каталог, который содержит тысячи файлов, некоторые из них скрыты.
Команда выводит ls -a
список всех файлов, включая скрытые, но мне нужно просто перечислить скрытые файлы.
Какую команду я должен использовать?
command-line
ls
Nux
источник
источник
ls -ld .*
илиls -ald .*
будет работатьОтветы:
Команда :
Будет только список скрытых файлов.
Объясните:
источник
.
и..
из матча. Однако это также исключает (вполне законные) односимвольные скрытые имена файлов , таких как.a
,.1
и так далее. Возможно, лучшим расширенным глобусом будет,.!(|.)
например, буквальная точка, за которой следует что угодно, кроме ничего или другой (единственной) точки, т.е.ls -d .!(|.)
Делает именно то, что ищет OP.
источник
!(pattern-list)
,pattern-list
это список из одного или нескольких шаблонов, разделенных символом a|
, но меня смущает, что слева от вас нет шаблона|
. Не могли бы вы объяснить мне этот синтаксис?.
не следует (ничего или.
), исключая.
себя и..
.Если вы просто хотите, чтобы файлы в вашем текущем каталоге (без рекурсии), вы можете сделать
При этом будут напечатаны имена всех файлов, имя которых начинается с
.
символа « a» и сопровождается одним или несколькими точечными символами. Обратите внимание, что это не удастся для файлов, имя которых начинается с последовательных точек, поэтому, например....foo
, не будет отображаться.Вы также можете использовать
find
:В
-mindepth
гарантирую , что мы не соответствуем.
и-prune
средствам , которыеfind
не сойдут в подкаталоги.источник
у меня работает в баш.
источник
.
и..
в БашИспользуя
find
иawk
,Объяснение:
find . -type f
-> Вывести список всех файлов в текущем каталоге вместе с его путем, как,awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
/
в качестве разделителя полей awk проверяет последнее поле, начиная с точки или нет. Если он начинается с точки, то он печатает последнее поле этой соответствующей строки.источник
find -type f
. Вам не нужно явно указывать путь поиска или-name "*"
.find
обычно это лучший вариант для сложных поисков, чем использование подстановки имен.или же
find .
ищет в текущем каталоге-mindepth 1
исключает . и .. из списка-maxdepth 1
ограничивает поиск текущим каталогом-name '.*'
найти имена файлов, которые начинаются с точки-o
или же-name '*~'
найти имена файлов, заканчивающиеся тильдой (обычно это файлы резервных копий из программ редактирования текста)Тем не менее, этот и все другие ответы пропускают файлы, которые находятся в
.hidden
файле текущего каталога . Если вы пишете скрипт, то эти строки будут читать.hidden
файл и отображать имена файлов тех, которые существуют.источник
.hidden
файл? Зачем вообще нужен.hidden
файл с именами? Во всяком случае, если есть один, почему вы делаете что-то такое сложное, когда все, что вам нужно будетcat .hidden
? Вашаfind
команда верна (ish), но не-name '*~'
имеет значения. Файлы, оканчивающиеся на тильды, являются файлами резервных копий, но никак не скрыты..hidden
Файл предназначен для файлов и папок, которые вы хотите скрыть, если вы не можете изменить имя файла / папки, чтобы начать с точки. Что касается файлов, оканчивающихся на тильды, это зависит от системы.ls -B
будет игнорировать такие файлы, как и большинство исследователей файлов с графическим интерфейсом.cat .hidden
может показывать файлы, которые больше не существуют, если эти файлы были удалены или перемещены после добавления в.hidden
файл.Я думаю, что вы можете сделать это с помощью следующей команды.
ls -a
введенная вами команда, которая показывает все файлы и каталоги в текущем рабочем каталоге.grep "^\."
добавленная команда, которая фильтрует вывод, показывает только скрытые файлы (название начинается с"."
).grep -v "^\.$" | grep -v "^\..$"
добавлена команда, которая фильтрует вывод для исключения., .. (Это текущий и родительский каталог).Если некоторые имена файлов могут содержать более одной строки
"\n"
, приведенный выше пример может быть неправильным.Поэтому я предлагаю следующую команду, чтобы решить эту проблему.
источник
ls
должны анализировать вывод .Что еще вы могли бы сделать,
is ls .?*
илиls .!(|)
это покажет вам все в текущем каталоге скрытых файлов / каталогов вверху и других файлов / каталогов ниженапример: из моего терминала
Теперь обратите внимание на результаты выше, он показывает вам каждый файл / dir с его subdir и скрытыми файлами прямо ниже.
Извините, я не могу комментировать. чтобы объяснить разницу между здесь
ls .?*
и @ cioby23 ответls -d .[!.]* .??*
А почему это на самом деле печатать скрытые файлы в два раза , потому что буквально вы спрашиваете дважды.??*
,.?*
,.[!.]*
они то же самое, так что добавление любого из них с различными символами команды будут печатать в два раза.источник
Вы также можете использовать:
Это позволит вам отображать обычные скрытые файлы и скрытые файлы, которые начинаются с 2 или 3 точек, например:
..hidden_file
источник
вы можете использовать команду
Это имеет преимущество, заключающееся в том, что в список разрешается многостолбцовый список, в отличие от подхода на основе grep в
ls -a | grep "^\."
решениях.источник
Все ответы на данный момент основаны на том факте, что файлы (или каталоги), имена которых начинаются с точки, являются «скрытыми». Я придумал другое решение, которое может быть не столь эффективным, но оно не предполагает ничего о именах скрытых файлов и поэтому избегает перечисления
..
в результате (как и принятый в настоящее время ответ).Полная команда:
объяснение
Это делает список всех файлов (и каталогов) дважды,
но показывает скрытые файлы только один раз
-A
.Затем список сортируется, в результате
| sort
чего обычные (невидимые) файлы появляются дважды и рядом друг с другом.Затем удалите все строки, которые появляются более одного раза
| uniq -u
, оставляя только уникальные строки.Наконец, используйте
ls
снова, чтобы получить список всех файлов с пользовательскими настройками пользователя и без перечисления содержимого каталогов в списке-d
.РЕДАКТИРОВАТЬ (Ограничения):
Как указал muru, это решение не будет работать правильно, если есть файлы с именами, например,
escaped\ncharacter.txt
потомуecho -e
что разделит имя файла на две строки. Он также не будет работать должным образом, если есть два скрытых файла с почти одинаковыми именами, за исключением специального символа, такого как.foo[tab].txt
и.foo[new-line].txt
оба из которых печатаются как.foo?.txt
и будут удаленыuniq -u
источник
.
первым символом...
, но мне интересно, насколько хорошо это работает с именами файлов, содержащими специальные символы.echo -e
будут интерпретироваться. Также:ls
не будет искажать имена файлов, так что два разных имени файла будут отображаться одинаково (например, в некоторых версияхls
будут использоваться?
специальные символы, поэтому.foo\tbar
(\t
=> tab) и.foo\nbar
(\n
=> newline) оба будут отображаться какfoo?bar
).Кроме того, вы также можете использовать
echo .*
например
Если вы предпочитаете формат длинного списка, просто преобразуйте пробел в новую строку.
источник
При использовании bash установка
GLOBIGNORE
специальной переменной - это не пустое значение, чтобы игнорировать его.
и..
при расширении глобусов. Из документации Bash :Если мы установим его
.:..
, оба.
и..
будут игнорироваться. Так как установка этого значения на ненулевое значение также приведет к такому поведению, мы могли бы также установить его на.
Так:
источник