Как показать только скрытые файлы в Терминале?
У меня есть каталог, который содержит тысячи файлов, некоторые из них скрыты.
Команда 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.txtls -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 /команды вернут строки, не содержащие косую черту.