LINUX.ORG.RU
ФорумAdmin

вопрос по Globbing

 ,


0

1

Перехожу в папку с файлами и в командной строке выполняю:

for per in * ; do echo "$per" ; done
и не вижу скрытых файлов, а вот так:
for per in .* ; do echo "$per" ; done
вижу только скрытые файлы.

Скорее всего я ошибаюсь, но на сколько я знаю:

for per in * ; do echo "$per" ; done
должно показать все файлы и скрытые в том числе.

★★

POSIX:

If a filename begins with a period ( ‘.’ ), the period shall be explicitly matched by using a period as the first character of the pattern or immediately following a slash character. The leading period shall not be matched by:

  • The asterisk or question-mark special characters

  • A bracket expression containing a non-matching list, such as "[!a]", a range expression, such as "[%-0]", or a character class expression, such as "[[:punct:]]"

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

xaizek спасибо!

Я не знал, век живи век учись.

А как тогда лучше получить список всех файлов и папок и загнать этот список в переменную? Я вот так делаю:

for per in "$(ls -a)"

Но пишут, что ls лучше не использовать, получается надо делать два раза:

for per in *
а потом:
for per in .*

v4567 ★★
() автор топика
Ответ на: комментарий от v4567

Можно же несколько шаблонов использовать:

for per in .* *

Только надо быть осторожным со специальными каталогами . и ...

xaizek ★★★★★
()

shopt -s dotglob

anonymous
()
Ответ на: комментарий от v4567

А как тогда лучше получить список всех файлов и папок и загнать этот список в переменную?

Не надо загонять список файлов в переменную. Это бесполезно, а неопытные писатели шелскриптов всегда выбирают самый муторный и чреватый ошибками способ это сделать. Списком файлов в юниксе является каталог. Если надо что-то сделать с файлами или с их именами - так и делаешь for i in * .* или find .... -exec ....

legolegs ★★★★★
()

Какое же все-таки унылое гомно этот шелл. Даже эхо стокгольмского синдрома в треде прошептало.

Вариант с ls -a (-A) чем не устраивает советчиков-то? Грешно, несвято?

anonymous
()
Ответ на: комментарий от anonymous

Грешно, несвято?

Хуже только VAR=`ls -A`

Deleted
()
Ответ на: комментарий от anonymous

А потом встретится пробел в имени файла и пошло-поехало.

anonymous
()
Ответ на: комментарий от legolegs

Ещё раз огромное всем спасибо за помощь!

Я как то не додумался использовать сразу * и .* Хочу спросить совет, правильно будет загнать список файлов в массив и с ним работать? Если например есть нестандартные названия файлов которые содержат символы перевода строки, или ещё какие нибудь символы: *, /, ? и т.д.

v4567 ★★
() автор топика
Ответ на: комментарий от v4567

правильно будет

Вопрос неверный. Верный вопрос - что и зачем?

Deleted
()
Ответ на: комментарий от anonymous

Верно глаголишь, анон. Вместо этих Shell-извращений нужно брать нормальный ЯП – Perl, Python и т. д.

EXL ★★★★★
()
Ответ на: комментарий от v4567

Вариант с ls -a (-A) чем не устраивает советчиков-то?

если в названии файла есть пробел то в переменную оно попадёт как два разных файла, а с * как один с пробелом внутри названия.
Я раньше делал так «$(ls -a)» что бы файл с пробелами полностью залетел в переменную.

v4567 ★★
() автор топика
Последнее исправление: v4567 (всего исправлений: 1)
Ответ на: комментарий от v4567

если в названии файла есть пробел

Шёл 2019 год…

В Bash’е всё так и приходилось костылить и экранировать пробелы и семьдесят видов различных кавычек.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Хотелось бы вот ещё что проверить. Как в название файла поместить символ перевода строки?
Вот такой файл:

touch "11\n11"
никак не влияет на дальнейшую с ним работу. Может в названии файла символ перевода строки как то обозначается по другому?

v4567 ★★
() автор топика
Ответ на: комментарий от EXL

Несилятор-way: освой инструмент на 1/10, примени не там и не так и затем громко ной, какой плохой инструмент.

touch $'new\nline'
legolegs ★★★★★
()
Ответ на: комментарий от v4567

правильно будет загнать список файлов в массив и с ним работать?

Нет, в большинстве случаев это будет неправильно и есть способы проще и естественнее. И не только потому, что ммена файлов могут содержать любые символы кроме \0 и /

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

правильно будет загнать список файлов в массив и с ним работать?

Нет, в большинстве случаев это будет неправильно и есть способы проще и естественнее.

Если бы привели ссылки с описанием этих способов, было бы хорошо.

Если создать файл с символом перевода строки, вот так:

touch "$(echo -e "11\n11")"

или вот так:

touch $'new\nline'

работают оба способа.

То вот такие методы загнать список файлов в переменную не работают:

for per in * .* ; do echo "$per" ; done
for per in "$(ls -a)" ; do echo "$per" ; done

Как же тогда работать с такими файлами?

v4567 ★★
() автор топика
Ответ на: комментарий от v4567

То вот такие методы загнать список файлов в переменную не работают: Работают!

$ touch $'new\nline'
$ ll
итого 0
-rw-r----- 1 legolegs legolegs 0 апр 14 19:30 'new'$'\n''line'
$ for per in * .* ; do echo "$per" ; done
new
line
.
..
$ for per in * .* ; do echo _"$per"_ ; done
_new
line_
_._
_.._

Как же тогда работать с такими файлами? Брать и сразу работать!

for per in * .* ; do rm "$per" ; done
legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

то есть он всё равно идёт как один файл

v4567 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.