правильный способ перебирать содержимое каталога

правильный способ перебирать содержимое каталога

Мне нужно перебрать все файлы внутри каталога. Один из распространенных способов, который я видел, — это использование цикла 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

Связанный контент