Как показать только скрытые файлы в Терминале?
У меня есть каталог, который содержит тысячи файлов, некоторые из них скрыты.
Команда 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
Если вы просто хотите, чтобы файлы в вашем текущем каталоге (без рекурсии), вы можете сделать
echo .[^.]*
Это напечатает имена всех файлов, имя которых начинается с .
и сопровождается одним или несколькими не точечными символами. Обратите внимание, что это не удастся для файлов, имя которых начинается с последовательных точек, например, ....foo
не будет показан
Вы также можете использовать find
:
find -mindepth 1 -prune -name '.*'
-mindepth
гарантирует, что мы не совпадаем .
и -prune
Значит это find
не сойдет в подкаталоги.
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
ls -d .*
нежелательно показывает.
а также..
ls -d .?*
(текущий принятый ответ) нежелательно показывает..
ls -d .[!.]*
нежелательно не покажет..i_am_also_a_hidden_file.txt
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
: Откройте терминал и введите:
- Создайте каталог по адресу:
mkdir ~/bin
- Скопируйте возвышенный исполняемый файл на свой
~/bin
каталог:ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" ~/bin/subl
BASH (по умолчанию для Mac OS)
Используйте эти инструкции, если вы не знаете, что у вас есть zsh
- Если вы используете bash (по умолчанию для Mac OS), добавьте строку в
~/.bash_profile
файл:echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile
- Установите Sublime в качестве редактора по умолчанию
echo "export EDITOR='subl -w'" >> ~/.bash_profile
ЗШ
Если вы не знаете, что такое zsh, у вас его нет.
Если вы используете zsh, добавьте строку в
~/.zshrc
файл:echo 'export PATH=$PATH:$HOME/bin' >> ~/.zshrc
Установите Sublime в качестве редактора по умолчанию
echo "export EDITOR='subl -w'" >> ~/.zshrc
Перезапустите терминал и введите:
subl .
Sublime должен открыться в текущем каталоге.
Проверьте команды 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 /
команды вернут строки, не содержащие косую черту.