Ответы:
Команда :
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
.и ..из матча. Однако это также исключает (вполне законные) односимвольные скрытые имена файлов , таких как .a, .1и так далее. Возможно, лучшим расширенным глобусом будет, .!(|.)например, буквальная точка, за которой следует что угодно, кроме ничего или другой (единственной) точки, т.е.ls -d .!(|.)
ls -d .!(|.)
Делает именно то, что ищет OP.
!(pattern-list), pattern-listэто список из одного или нескольких шаблонов, разделенных символом a |, но меня смущает, что слева от вас нет шаблона |. Не могли бы вы объяснить мне этот синтаксис?
.не следует (ничего или .), исключая .себя и ...
Если вы просто хотите, чтобы файлы в вашем текущем каталоге (без рекурсии), вы можете сделать
echo .[^.]*
При этом будут напечатаны имена всех файлов, имя которых начинается с .символа « a» и сопровождается одним или несколькими точечными символами. Обратите внимание, что это не удастся для файлов, имя которых начинается с последовательных точек, поэтому, например ....foo, не будет отображаться.
Вы также можете использовать find:
find -mindepth 1 -prune -name '.*'
В -mindepthгарантирую , что мы не соответствуем .и -pruneсредствам , которые findне сойдут в подкаталоги.
Используя findи awk,
find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
Объяснение:
find . -type f -> Вывести список всех файлов в текущем каталоге вместе с его путем, как,
./foo.html
./bar.html
./.foo1
awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
/в качестве разделителя полей awk проверяет последнее поле, начиная с точки или нет. Если он начинается с точки, то он печатает последнее поле этой соответствующей строки.
find -type f. Вам не нужно явно указывать путь поиска или -name "*".
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
.hiddenфайл? Зачем вообще нужен .hiddenфайл с именами? Во всяком случае, если есть один, почему вы делаете что-то такое сложное, когда все, что вам нужно будет cat .hidden? Ваша findкоманда верна (ish), но не -name '*~'имеет значения. Файлы, оканчивающиеся на тильды, являются файлами резервных копий, но никак не скрыты.
.hiddenФайл предназначен для файлов и папок, которые вы хотите скрыть, если вы не можете изменить имя файла / папки, чтобы начать с точки. Что касается файлов, оканчивающихся на тильды, это зависит от системы. ls -Bбудет игнорировать такие файлы, как и большинство исследователей файлов с графическим интерфейсом.
cat .hiddenможет показывать файлы, которые больше не существуют, если эти файлы были удалены или перемещены после добавления в .hiddenфайл.
Я думаю, что вы можете сделать это с помощью следующей команды.
ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
ls -a введенная вами команда, которая показывает все файлы и каталоги в текущем рабочем каталоге.
grep "^\."добавленная команда, которая фильтрует вывод, показывает только скрытые файлы (название начинается с ".").
grep -v "^\.$" | grep -v "^\..$" добавлена команда, которая фильтрует вывод для исключения., .. (Это текущий и родительский каталог).
Если некоторые имена файлов могут содержать более одной строки "\n", приведенный выше пример может быть неправильным.
Поэтому я предлагаю следующую команду, чтобы решить эту проблему.
find -maxdepth 1 -name ".[!.]*"
ls должны анализировать вывод .
Что еще вы могли бы сделать, 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 .[!.]* .??*А почему это на самом деле печатать скрытые файлы в два раза , потому что буквально вы спрашиваете дважды .??*, .?*, .[!.]*они то же самое, так что добавление любого из них с различными символами команды будут печатать в два раза.
Все ответы на данный момент основаны на том факте, что файлы (или каталоги), имена которых начинаются с точки, являются «скрытыми». Я придумал другое решение, которое может быть не столь эффективным, но оно не предполагает ничего о именах скрытых файлов и поэтому избегает перечисления ..в результате (как и принятый в настоящее время ответ).
Полная команда:
ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)
объяснение
Это делает список всех файлов (и каталогов) дважды,
echo -e "$(\ls)\n$(\ls -A)"
но показывает скрытые файлы только один раз -A.
Затем список сортируется, в результате | sortчего обычные (невидимые) файлы появляются дважды и рядом друг с другом.
Затем удалите все строки, которые появляются более одного раза | uniq -u, оставляя только уникальные строки.
Наконец, используйте lsснова, чтобы получить список всех файлов с пользовательскими настройками пользователя и без перечисления содержимого каталогов в списке -d.
РЕДАКТИРОВАТЬ (Ограничения):
Как указал muru, это решение не будет работать правильно, если есть файлы с именами, например, escaped\ncharacter.txtпотому echo -eчто разделит имя файла на две строки. Он также не будет работать должным образом, если есть два скрытых файла с почти одинаковыми именами, за исключением специального символа, такого как .foo[tab].txtи .foo[new-line].txtоба из которых печатаются как .foo?.txtи будут удаленыuniq -u
.первым символом.
.., но мне интересно, насколько хорошо это работает с именами файлов, содержащими специальные символы.
echo -eбудут интерпретироваться. Также: lsне будет искажать имена файлов, так что два разных имени файла будут отображаться одинаково (например, в некоторых версиях lsбудут использоваться ?специальные символы, поэтому .foo\tbar( \t=> tab) и .foo\nbar( \n=> newline) оба будут отображаться как foo?bar).
Кроме того, вы также можете использовать 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:~$
При использовании bash установка GLOBIGNOREспециальной переменной - это не пустое значение, чтобы игнорировать его .и ..при расширении глобусов. Из документации Bash :
GLOBIGNOREПеременной оболочки могут быть использованы для ограничения множества имен файлов , соответствующих шаблону. ЕслиGLOBIGNOREустановлено, каждое совпадающее имя файла, которое также соответствует одному из шаблонов,GLOBIGNOREудаляется из списка совпадений. Еслиnocaseglobопция установлена, сопоставление с шаблонами вGLOBIGNOREвыполняется без учета регистра. Имена файлов.и..всегда игнорируются, когдаGLOBIGNOREустановлено и не равно нулю. Однако установкаGLOBIGNOREненулевого значения приводит к включению опции оболочки dotglob, поэтому все остальные имена файлов, начинающиеся с‘.', будут совпадать.
Если мы установим его .:.., оба .и ..будут игнорироваться. Так как установка этого значения на ненулевое значение также приведет к такому поведению, мы могли бы также установить его на.
Так:
GLOBIGNORE=.
ls -d .*
ls -ld .*илиls -ald .*будет работать