Безопасный список файлов создается с помощью *
без кавычек, поиск не используется:
$ echo *
Давайте протестируем несколько файлов:
$ mkdir test-dir; cd test-dir
$ touch clean normal_file 'a%b' 'has two spaces' '*' 'a*b' '?' 'a?b'
$ touch '$' 'a$b' '%' 'a%b' $'new\nline' $'em\u2001quad' 'normal_file'
echo *
команда выдаст с указанными выше файлами:
? $ * % a?b a$b a*b a%b clean em quad has two spaces new
line normal_file
Список, разделенный пробелом, который, да, состоит из двух строк, поскольку есть файл с новой строкой в его имени.
Более простой способ увидеть файлы - заключить их имена в кавычки printf '% q'
и добавить новую строку, например printf '% q \ n'
, мы получим чистый список файлов:
$ printf '%q\n' *
\?
\$
\*
%
a\?b
a\$b
a\*b
a%b
clean
$'em\342\200\201quad'
has\ two\ spaces
$'new\nline'
normal_file
Конечно, вам нужно выбрать некоторые файлы, а не все, как с обычным *.
Итак, мы создаем шаблон из всех символов для соответствия: ? $ *%
.
Однако большинство этих символов являются «особыми» и нуждаются в кавычках, когда появляются в некоторых порядках. В частности, если *
или ?
следует за $
, они расширяются оболочкой, что может создать проблемы.
Обязательно укажите $
.
Тогда простой способ получить все остальные символы в кавычках - это использовать printf '% q'? \ $ *%
. Это даст: \? \ $ \ *%
. Если обратная косая черта не является строго необходимой, она не вызовет никакого вреда, экранированный символ все равно будет работать.
В этот список нам нужно добавить несколько пустых символов. Но включение новой строки становится серьезной проблемой. Самый простой способ справиться с новой строкой внутри класса символов - использовать [[: space:]]
, который будет включать новую строку, пробел, табуляцию и некоторые другие символы пробела в виде длинного тире. .
Таким образом, команда выглядит так:
$ printf '%q\n' *[\?\$\*%[:space:]]*
\?
\$
\*
%
a\?b
a\$b
a\*b
a%b
$'em\342\200\201quad'
has\ two\ spaces
$'new\nline'
Обратите внимание, что имена файлов clean
и normal_file
не указаны, как требуется.