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

111

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

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

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

    
задан nux 19.05.2014 в 02:10
источник

12 ответов

140

Команда:

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 
    
ответ дан nux 19.05.2014 в 02:10
источник
28
ls -d .!(|.)

Именно то, что ищет OP.

    
ответ дан patrick 19.05.2014 в 06:52
13

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

echo .[^.]*

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

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

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

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

ответ дан terdon 19.05.2014 в 04:57
11
ls -ad .*

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

    
ответ дан Mark 19.05.2014 в 06:55
4

Использование find и awk ,

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

Объяснение:

find . -type f - > Перечислите все файлы в текущем каталоге вместе с таким путем, как

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

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

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

    
ответ дан Avinash Raj 19.05.2014 в 04:46
3

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

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
    
ответ дан Mark H 19.05.2014 в 23:24
2

Что еще вы могли бы сделать, 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 с его субдирером и любыми скрытыми файлами прямо ниже.

[1:0:248][[email protected]: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 answer ls -d .[!.]* .??* И почему она на самом деле печатает скрытые файлы дважды, потому что буквально вы спрашиваете дважды .??* , .?* , .[!.]* они то же самое , поэтому добавление любого из них с разными командами будет печататься дважды.

    
ответ дан amrx 19.03.2015 в 06:47
2

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

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

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

grep "^\." команда Я добавил, что для вывода фильтров отображаются только скрытые файлы (имя начинается с "." ).

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

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

Поэтому я предлагаю следующую команду для решения этой проблемы.

find -maxdepth 1 -name ".[!.]*"
    
ответ дан xiaodongjie 19.05.2014 в 04:00
1

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

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

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

Объяснение

Что это значит, это список файлов (и каталогов) дважды,

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

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

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

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

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

EDIT (Ограничения):

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

    
ответ дан alejandro 26.09.2018 в 04:00
1

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

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

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

    
ответ дан cioby23 19.05.2014 в 07:05
1

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

ls -Ad .??*

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

    
ответ дан Maythux 06.05.2015 в 17:46
0

С помощью bash установка специальной переменной GLOBIGNORE - это некоторое непустое значение, чтобы игнорировать . и .. при расширении glob. Из документов Bash :

The GLOBIGNORE shell variable may be used to restrict the set of filenames matching a pattern. If GLOBIGNORE is set, each matching filename that also matches one of the patterns in GLOBIGNORE is removed from the list of matches. If the nocaseglob option is set, the matching against the patterns in GLOBIGNORE is performed without regard to case. The filenames . and .. are always ignored when GLOBIGNORE is set and not null. However, setting GLOBIGNORE to a non-null value has the effect of enabling the dotglob shell option, so all other filenames beginning with a ‘.’ will match.

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

Итак:

GLOBIGNORE=.
ls -d .*
    
ответ дан muru 26.09.2018 в 04:36