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


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

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

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


108
2018-05-19 00:10


происхождения


Просто ls -ld .* или ls -ald .* будет работать - John Strood


ответы:


Команда :

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 

135
2018-05-19 00:10



Вам не нужны два вопросительных знака там, * охватывает его (? Соответствует только одному символу, * соответствует любому числу). - psusi
@psusi, я думаю, что цель состоит в том, чтобы исключить . а также .. от матча. Однако он также исключает (совершенно законные) односимвольные скрытые имена файлов, такие как .a, .1 и так далее. Возможно, лучший расширенный глобус будет .!(|.) т.е. буквальная точка, за которой следует что-либо, кроме ничего или другого (единственного), то есть i.e. ls -d .!(|.) - steeldriver
@steeldriver, опрятный, ??? версия исключает "." а также "..". Кажется, это результат интересной причуды: ни? ни * будет соответствовать точке, но? должен соответствовать что нибудь в противном случае имя игнорируется. - psusi
Чтобы идентифицировать каталоги и файлы, добавьте параметр F, то есть имена файлов ls -ldF.? * Имеют «/», поскольку в последних отображаемых символьных файлах нет. - RCF
Это почти работает, за исключением того, что он также содержит скрытые папки, такие как .vim, которые я считаю не файлом здесь. Я немного изменяю его как ls -ldp.? * | grep -v / Это только список скрытых файлов, а не скрытая папка - Fred Yang


ls -d .!(|.)

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


28
2018-05-19 04:52



Как это работает? - SarcasticSully
список каталогов ничего с. и не перечисляйте ничего без него, это то, что он в значительной степени переводит. - patrick
Я понимаю, что в !(pattern-list), pattern-list представляет собой список одного или нескольких шаблонов, разделенных |, но для меня сбивает с толку, что у вас нет рисунка слева от |, Не могли бы вы объяснить мне этот синтаксис? - Carlos Mendoza


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

echo .[^.]*

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

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

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

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


13
2018-05-19 02:57





ls -ad .*

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


11
2018-05-19 04:55



шоу . а также .. в Баше - Penghe Geng


С помощью 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
2018-05-19 02:46



Вы могли бы просто использовать find -type f, Вам не нужно явно указывать путь поиска или -name "*", - terdon♦


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
2018-05-19 21:24



Что такое .hidden файл? Зачем когда-нибудь был файл с именем .hidden который содержит имена файлов? Во всяком случае, если есть один, почему бы вам сделать что-то такое сложное, когда все, что вам нужно, было бы cat .hidden? Ваш find правильная команда (ish), но -name '*~' не имеет значения. Файлы, которые заканчиваются в тильдах, являются резервными файлами, но никоим образом не скрыты. - terdon♦
@terdon .hidden файл предназначен для файлов и папок, которые вы хотите скрыть, если вы не можете изменить имя файла / папки, чтобы начать с точки. Что касается файлов, которые заканчиваются тильдами, это зависит от системы. ls -B будут игнорировать такие файлы, как большинство исследователей файлов GUI. - Mark H
cat .hidden могут отображаться файлы, которые больше не существуют, если эти файлы были удалены или перемещены с момента добавления в .hidden файл. - Mark H
Это хорошо работает. - Penghe Geng


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

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

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

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

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

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

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

find -maxdepth 1 -name ".[!.]*"

2
2018-05-19 02:00



Вам следует никогда не анализировать вывод ls, - Radu Rădeanu
@ RaduRădeanu Я видел твой комментарий. Это так хорошо. Я снова отредактировал свой ответ. Благодарим вас за комментарий. - xiaodongjie


Что еще вы могли бы сделать, is ls .?* Или ls .!(|) который покажет вам все в текущем каталоге скрытых файлов / директорий в верхней части и других файлах / каталогах ниже

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

$ 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
2018-03-19 05:47