У меня есть каталог, который содержит тысячи файлов, некоторые из них скрыты.
Команда ls -a
перечислите все файлы, включая скрытые, но я должен только перечислить скрытые файлы.
Какую команду я должен использовать?
Команда:
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 .*
, например,
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:~$
Если Вы просто хотите файлы в своем текущем каталоге (никакая рекурсия), Вы могли бы сделать
echo .[^.]*
, Который распечатает названия всех файлов, имя которых запускается с .
и сопровождается одним или несколькими неточечными символами. Обратите внимание, что это перестанет работать для файлов, имя которых запускается с последовательных точек, таким образом, например ....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
обычно более оптимальный вариант для сложных поисков, чем использование имени globbing.
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
Я думаю, что можно сделать это со следующей командой.
ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
ls -a
команда Вы вошли, который показывает все файлы и каталоги в текущем рабочем каталоге.
grep "^\."
команда, которую я добавил, который фильтрует вывод к шоу только скрытые файлы (Это - имя, запускается с "."
).
grep -v "^\.$" | grep -v "^\..$"
команда, которую я добавил, который фильтрует вывод для исключения... (Они - текущий и родительский каталог).
, Если некоторые имена файлов могут иметь больше, чем строка с "\n"
выше примера, могло бы быть неправильным.
, Таким образом, я предлагаю, чтобы следующая команда решила его проблема.
find -maxdepth 1 -name ".[!.]*"
Можно также использовать:
ls -d .[!.]* .??*
Это позволит Вам отображать нормальные скрытые файлы и скрытые файлы, которые начинаются с 2 или 3 точек, например: ..hidden_file
можно использовать команду
ls -Ad .??*
, Это имеет преимущество разрешения многостолбцового списка, в отличие от находящегося в grep подхода в эти ls -a | grep "^\."
решения
Что еще Вы, возможно, сделали, is ls .?*
Или ls .!(|)
это покажет Вам все в текущем dir скрытые файлы/директора на вершине и другие файлы/директора ниже
например: от моего терминала
$ 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
С ударом, устанавливая GLOBIGNORE
специальная переменная является некоторым непустым значением, достаточно, чтобы заставить его проигнорировать .
и ..
при расширении шариков. Из документов Bash:
GLOBIGNORE
переменная оболочки может использоваться для ограничения набора имен файлов, соответствующих шаблону. ЕслиGLOBIGNORE
установлен, каждое имя файла соответствия, которое также соответствует одному из шаблонов вGLOBIGNORE
удален из списка соответствий. Еслиnocaseglob
опция установлена, соответствие против шаблонов вGLOBIGNORE
выполняется без учета регистра. Имена файлов.
и..
всегда игнорируются когдаGLOBIGNORE
установлен и не пустой. Однако установкаGLOBIGNORE
к ненулевому значению имеет эффект включения опции оболочки dotglob, таким образом, все другие имена файлов, начинающиеся a‘.
’будет соответствовать.
Если мы устанавливаем его на .:..
, оба .
и ..
будет проигнорирован. Начиная с установки это к чему-либо непустому также получит это поведение, мы могли бы также установить его на просто .
Так:
GLOBIGNORE=.
ls -d .*
Подход 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 "\\."
Лично мне так больше нравится
Вы также можете использовать подстановку процессов
diff <(ls -1A) <(ls -1)
Объяснение:
Передача stdout одной команды в stdin другой — мощная техника. Но что, если вам нужно передать стандартный вывод нескольких команд? Вот где происходит замена процесса. Подстановка процесса передает вывод процесса (или процессов) в стандартный ввод другого процесса
Итак, вы передаете два вывода в команду diff.
Первая команда — «ls -1A». Флаг "-A" работает так же, как флаг "-a", но не показывает "." и "..". Таким образом, он в основном показывает вам все файлы и каталоги (как скрытые, так и не скрытые) в каталоге. Флаг «-1» отображает вывод «ls» один под другим по вертикали, а не в горизонтальном списке.
Мне не нравится -d
, потому что он показывает соответствий не найдено
, только если совпадений нет.
Также не отображается общий [размер]
вверху строк.
Я думаю, что ls -lA --ignore "[^\.]*"
является лучшим решением.
Вы можете использовать команду
ls -pa | grep -v /
Объяснение флагов:
-p
добавит индикатор "/" к каталогам-a
выведет список скрытых файловgrep -v / Команды
будут возвращать строки, не содержащие косую черту.