Ответы:
Команда :
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 .*
будет работать