Как показать только скрытые файлы в Терминале?

У меня есть каталог, который содержит тысячи файлов, некоторые из них скрыты.

Команда ls -a перечислите все файлы, включая скрытые, но я должен только перечислить скрытые файлы.

Какую команду я должен использовать?

155
задан 25 September 2018 в 19:10

17 ответов

Команда:

ls -ld .?* 

только перечислит скрытые файлы.

Объясните:

 -l     use a long listing format

 -d, --directory
              list  directory entries instead of contents, and do not derefer‐
              ence symbolic links

.?* will only state hidden files 
191
ответ дан 22 November 2019 в 22:51

С другой стороны, можно также использовать echo .*

, например,

user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$

, Если Вы предпочитаете его в формате длинного списка, просто преобразовываете пробел в новую строку.

user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$ 
1
ответ дан 22 November 2019 в 22:51
ls -d .!(|.)

Делает точно, что ищет OP.

31
ответ дан 22 November 2019 в 22:51

Если Вы просто хотите файлы в своем текущем каталоге (никакая рекурсия), Вы могли бы сделать

echo .[^.]*

, Который распечатает названия всех файлов, имя которых запускается с . и сопровождается одним или несколькими неточечными символами. Обратите внимание, что это перестанет работать для файлов, имя которых запускается с последовательных точек, таким образом, например ....foo не будет показан.

Вы могли также использовать find:

find -mindepth 1 -prune -name '.*'

Эти -mindepth гарантирует, чтобы мы не соответствовали . и -prune средства, которые find не будут убывать в подкаталоги.

16
ответ дан 22 November 2019 в 22:51
ls -ad .*

работы для меня в Bash.

15
ответ дан 22 November 2019 в 22:51

Используя find и awk,

find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

Объяснение:

find . -type f-> Список все файлы в текущем каталоге наряду с он - путь как,

./foo.html
./bar.html
./.foo1

awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

/ как разделитель полей awk проверки на последнее поле, смотрящее с точкой или нет. Если это запускается с точки, то это печатает последнее поле той соответствующей строки.

4
ответ дан 22 November 2019 в 22:51

find обычно более оптимальный вариант для сложных поисков, чем использование имени globbing.

find . -mindepth 1 -maxdepth 1 -name '.*'

или

find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'

find . текущий каталог поисков

-mindepth 1 исключает. и.. из списка

-maxdepth 1 пределы поиск к текущему каталогу

-name '.*' находит имена файлов, которые запускаются с точки

-o или

-name '*~', находят имена файлов, которые заканчиваются тильдой (обычно, это файлы резервных копий из программ редактирования текста)

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

if [[ -f .hidden]] # if '.hidden' exists and is a file
then
    while read filename # read file name from line
    do
        if [[ -e "$filename" ]] # if the read file name exists
        then
            echo "$filename" # print it
        fi
    done < .hidden # read from .hidden file
fi
3
ответ дан 22 November 2019 в 22:51

Я думаю, что можно сделать это со следующей командой.

ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"

ls -a команда Вы вошли, который показывает все файлы и каталоги в текущем рабочем каталоге.

grep "^\." команда, которую я добавил, который фильтрует вывод к шоу только скрытые файлы (Это - имя, запускается с ".").

grep -v "^\.$" | grep -v "^\..$" команда, которую я добавил, который фильтрует вывод для исключения... (Они - текущий и родительский каталог).

, Если некоторые имена файлов могут иметь больше, чем строка с "\n" выше примера, могло бы быть неправильным.

, Таким образом, я предлагаю, чтобы следующая команда решила его проблема.

find -maxdepth 1 -name ".[!.]*"
2
ответ дан 22 November 2019 в 22:51

Можно также использовать:

ls -d .[!.]* .??*

Это позволит Вам отображать нормальные скрытые файлы и скрытые файлы, которые начинаются с 2 или 3 точек, например: ..hidden_file

1
ответ дан 22 November 2019 в 22:51

можно использовать команду

ls -Ad .??*

, Это имеет преимущество разрешения многостолбцового списка, в отличие от находящегося в grep подхода в эти ls -a | grep "^\." решения

1
ответ дан 22 November 2019 в 22:51

Что еще Вы, возможно, сделали, is ls .?* Или ls .!(|) это покажет Вам все в текущем dir скрытые файлы/директора на вершине и другие файлы/директора ниже

например: от моего терминала

$ ls .?*       
.bash_history    .dmrc        .macromedia   .weather
.bash_logout     .gksu.lock   .profile      .wgetrc
.bash_profile    .bashrc.save .ICEauthority .toprc           .Xauthority
.bashrc          .lastdir     .viminfo      .xsession-errors
.bashrc~         .dircolors   .lynxrc       .vimrc           .xsession-errors.old

..:
Baron

.adobe:
Flash_Player

.aptitude:
cache  config

.cache:
compizconfig-1                              rhythmbox
dconf                                       shotwell

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

[1:0:248][ebaron@37signals:pts/4][~/Desktop]
$ ls .!(|)
.bash_aliases  .bashrc1  .bashrc1~

..:
askapache-bash-profile.txt  examples.desktop             Public           top-1m.csv
backups             Firefox_wallpaper.png        PycharmProjects          top-1m.csv.zip
Desktop             java_error_in_PYCHARM_17581.log  Shotwell Import Log.txt  topsites.txt
Documents           Music                Templates            Videos
Downloads           Pictures                 texput.log           vmware

Извините, я не могу прокомментировать. объяснить различие здесь между ls .?* и ответ @cioby23 ls -d .[!.]* .??* И почему это на самом деле печатает скрытые файлы, дважды то, потому что буквально Вы спрашиваете дважды .??*, .?*, .[!.]* они - то же самое, так добавляя, что любой из них с различными управляющими символами распечатает дважды.

2
ответ дан 22 November 2019 в 22:51

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

Полная команда:

ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)

Объяснение

То, что это делает, перечислить все файлы (и каталоги) дважды,

echo -e "$(\ls)\n$(\ls -A)"

но только показ скрытых файлов однажды -A.

Затем список отсортирован | sort который заставляет регулярные (раскрытые) файлы появиться дважды и друг рядом с другом.

Затем удалите все строки, которые появляются несколько раз | uniq -u, только отъезд уникальных строк.

Наконец используйте ls снова перечислять все файлы с пользовательскими опциями пользователя и не перечисляя содержание каталогов в списке -d.

РЕДАКТИРОВАНИЕ (Ограничения):

Как muru указанный, это решение не будет работать правильно, если будут файлы с именами такой как escaped\ncharacter.txt потому что echo -e разделит имя файла на две строки. Это не будет также работать как ожидалось, если будет два скрытых файла почти с тем же именем за исключением специального символа, такой как .foo[tab].txt и .foo[new-line].txt поскольку оба из тех печатаются как .foo?.txt и был бы устранен uniq -u

1
ответ дан 22 November 2019 в 22:51

С ударом, устанавливая GLOBIGNORE специальная переменная является некоторым непустым значением, достаточно, чтобы заставить его проигнорировать . и .. при расширении шариков. Из документов Bash:

GLOBIGNORE переменная оболочки может использоваться для ограничения набора имен файлов, соответствующих шаблону. Если GLOBIGNORE установлен, каждое имя файла соответствия, которое также соответствует одному из шаблонов в GLOBIGNORE удален из списка соответствий. Если nocaseglob опция установлена, соответствие против шаблонов в GLOBIGNORE выполняется без учета регистра. Имена файлов . и .. всегда игнорируются когда GLOBIGNORE установлен и не пустой. Однако установка GLOBIGNORE к ненулевому значению имеет эффект включения опции оболочки dotglob, таким образом, все другие имена файлов, начинающиеся a ‘.’будет соответствовать.

Если мы устанавливаем его на .:.., оба . и .. будет проигнорирован. Начиная с установки это к чему-либо непустому также получит это поведение, мы могли бы также установить его на просто .

Так:

GLOBIGNORE=.
ls -d .*
0
ответ дан 22 November 2019 в 22:51

Подход 1: ls -d .{[!.],.?}*

Объяснение: я хочу исключить . и .. , но включение файла, такого как ..i_am_also_a_hidden_file.txt

  1. ls -d .* нежелательно показывает . и ..
  2. ls -d .?* (текущий принятый ответ) нежелательно показывает ..
  3. ls -d .[!.]* нежелательно не будет показывать ..i_am_also_a_hidden_file.txt
  4. ls -d .{[!.],.?}* является ответом

Подход 2: ls -A | grep "\\."

Лично мне так больше нравится

2
ответ дан 3 May 2020 в 19:16

Вы также можете использовать подстановку процессов

 diff <(ls -1A) <(ls -1)

Объяснение:

Передача stdout одной команды в stdin другой — мощная техника. Но что, если вам нужно передать стандартный вывод нескольких команд? Вот где происходит замена процесса. Подстановка процесса передает вывод процесса (или процессов) в стандартный ввод другого процесса

Цитируется отсюда

Итак, вы передаете два вывода в команду diff.

Первая команда — «ls -1A». Флаг "-A" работает так же, как флаг "-a", но не показывает "." и "..". Таким образом, он в основном показывает вам все файлы и каталоги (как скрытые, так и не скрытые) в каталоге. Флаг «-1» отображает вывод «ls» один под другим по вертикали, а не в горизонтальном списке.

0
ответ дан 21 July 2020 в 15:06

Мне не нравится -d, потому что он показывает соответствий не найдено, только если совпадений нет.

Также не отображается общий [размер] вверху строк.

Я думаю, что ls -lA --ignore "[^\.]*" является лучшим решением.

0
ответ дан 2 August 2020 в 09:41

Вы можете использовать команду

ls -pa | grep -v /

Объяснение флагов:

  • -p добавит индикатор "/" к каталогам
  • -a выведет список скрытых файлов
  • grep -v / Команды будут возвращать строки, не содержащие косую черту.
-1
ответ дан 12 December 2020 в 17:27

Другие вопросы по тегам:

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