
Мне нужно перебрать все файлы внутри каталога. Один из распространенных способов, который я видел, — это использование цикла for, который начинается с for file in *; do
. Однако я понял, что он не включает скрытые файлы (файлы, которые начинаются с "."). Другой очевидный способ — сделать что-то вроде
for file in `ls -a`; do
Однако итерация ls
— плохая идея, потому что пробелы в именах файлов все портят. Каков правильный способ итерации по каталогу и получения всех скрытых файлов?
решение1
Вам просто нужно создать список файлов соответствия glob, разделенных пробелом:
for file in .* *; do echo "$file"; done
Редактировать
Вышеприведенное можно переписать в другой форме, используя раскрытие фигурных скобок
for file in {.*,*}; do echo "$file"; done
или еще короче:for file in {.,}*; do echo "$file"; done
Добавление пути к выбранным файлам:
for file in /path/{..?,.[!.],}*; do echo "$file"; done
Добавление пути для выбранных файлов:
for file in /path/{.,}*; do echo "$file"; done
Если вы хотите проявить изысканность и удалить из списка то, что обычно не нужно, .
и ..
просто изменить {.,}*
на {..?,.[!.],}*
.
Для полноты картины стоит упомянуть, что dotglob можно также настроить для сопоставления dot-файлов с чистым расширением *
.
shopt -s dotglob
В zsh
одном необходимо дополнительно установить, nullglob
чтобы предотвратить ошибку в случае несовпадений:
setopt nullglob
или, в качестве альтернативы, добавьте N
к шаблону квалификатор glob:
for file in /path/{.,}*(N); do echo "$file"; done