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

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

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

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

26 ответов

Решение

Команда:

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 
ls -d .!(|.)

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

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

echo .[^.]*

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

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

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

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

ls -ad .*

у меня работает в баш.

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

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

С помощью find а также awk,

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

Объяснение:

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

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

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

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

Подход 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 "\\."

Мне лично этот способ нравится больше

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

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

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

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

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

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

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

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

Что еще ты мог сделать, 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 .[!.]* .??* И почему он на самом деле печатает скрытые файлы дважды, потому что буквально вы спрашиваете дважды .??*, .?*, .[!.]* это одно и то же, поэтому добавление любого из них с разными командными символами приведет к печати дважды.

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

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

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

Так:

GLOBIGNORE=.
ls -d .*

Кроме того, вы также можете использовать 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:~$ 

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

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

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

объяснение

Это делает список всех файлов (и каталогов) дважды,

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

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

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

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

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

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

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

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

ls -Ad .??*

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

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

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

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

Спасибо за все советы здесь!

Вот функция для вашего файла .bash_aliases, которая не обрабатывает аргументы команды, не выдает ошибки в каталогах без скрытых файлов, добавляет / в перечисленные каталоги и выводит в один столбец.

      
lsa () {

    # Exit codes with/without argument are 0 if no hidden files present
    EXIT=$(ls -1d .!(|.) |& grep -q "No such file"; echo $?)
    EXIT_ARG=$(cd $1; ls -1d .!(|.) |& grep -q "No such file"; echo $?)

    # If no argument
    if [ $# -eq 0 ]; then
        if [ $EXIT -eq 0 ]; then
            printf ""
        else
            ls -1dp .!(|.)
        fi
    
    # If argument
    else
        if [ $EXIT_ARG -eq 0 ]; then
            printf ""
        else
            (cd $1; ls -1dp .!(|.))
        fi
    fi
}

ls -A | grep "^\."

  • ls -Aсписок всех файлов (скрытых и нескрытых)
  • grep "^\."отфильтровать те, которые начинаются с точки

Длинный список ответов, давайте добавим еще один, который, кажется, не включен:

$ ls -lA | grep ' \.'

Параметр -A команды ls включает все скрытые файлы, кроме .а также ...
grep, использованный выше, находит .(пробел, точка) и отфильтровывает строки, в которых этого нет.

$ ls -lA | grep -E '^d.* \.
... перечисляет только каталоги.

$ ls -lA | grep -Ev '^d.*' | grep ' \.'
... перечисляет только файлы.

... и последнее можно использовать как альтернативу только для файлов
$ ls -lA | grep -E '^d.*' | grep ' \.'
просто удалите флаг -v в grep

Я обычно использую короткий для файлов и каталогов:

ls -A .

Если вы хотите добавить атрибуты файла и так:

ls -lA .

Чтобы вывести список всех скрытых файлов и папок:

ls -ld .*

Чтобы отобразить только скрытые файлы:

ls -ld .*|grep -v ^d

Чтобы отобразить только скрытые папки:

ls -ld .*|grep ^d

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

Также не показывает total [size] вверху строк.

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

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

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

Пояснение:

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

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

Итак, вы подключаете два выхода к команде diff.

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

Код ниже показывает только скрытые файлы:

      ls -A | grep "^\."

или

      ls -ap | grep -v / | grep "^\."

Следуйте инструкциям их официального github: https://gist.github.com/barnes7td/3804534 .

Настройка терминала для Sublime Shortcutsubl: Откройте терминал и введите:

  1. Создайте каталог по адресу:
            mkdir ~/bin
    
  2. Скопируйте возвышенный исполняемый файл на свой~/binкаталог:
            ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" ~/bin/subl
    

BASH (по умолчанию для Mac OS)

Используйте эти инструкции, если вы не знаете, что у вас есть zsh

  1. Если вы используете bash (по умолчанию для Mac OS), добавьте строку в~/.bash_profileфайл:
            echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile
    
  2. Установите Sublime в качестве редактора по умолчанию
            echo "export EDITOR='subl -w'" >> ~/.bash_profile
    

ЗШ

Если вы не знаете, что такое zsh, у вас его нет.

  1. Если вы используете zsh, добавьте строку в~/.zshrcфайл:

            echo 'export PATH=$PATH:$HOME/bin' >> ~/.zshrc
    
  2. Установите Sublime в качестве редактора по умолчанию

            echo "export EDITOR='subl -w'" >> ~/.zshrc
    
  3. Перезапустите терминал и введите:

            subl .
    

    Sublime должен открыться в текущем каталоге.

  4. Проверьте команды unix:

            ls 
    

    Вы должны получить список каталогов.

Окна

Поместите в свой PATH.

Создатьsubl.batфайл и сохраните его в каталоге:C:\Program Files\Sublime Text 2

Внутри файла поместите:

      start sublime_text.exe %*

Вы также можете установить гораздо более удобную версию Rust:. Затем используйте следующее, чтобы получить более красивую древовидную визуализацию всех файлов:

      exa -Ta

Если вам действительно нравится exaкак и я, вы можете переопределить lsс псевдонимом на вашем .bashrc: alias ls="exa".

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

      ls -pa | grep -v /

Пояснения к флагам:

  • -pдобавит индикатор "/" к каталогам
  • -aвыведет список скрытых файлов
  • grep -v /команды вернут строки, не содержащие косую черту.

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

      ls -a | grep '^\.'
Другие вопросы по тегам