Как перечислять имена файлов, которые содержат пробелы и специальные символы, без использования find

Я пишу сценарий, который требует от меня предоставить список файлов в моем каталоге, имена файлов которых содержат пробелы, *,?, $,% И т. Д. Как я могу это сделать, я видел несколько сообщений, но не мог найти ничего, что сработает для меня. Можно ли добиться этого с помощью grep?

4 Solutions collect form web for “Как перечислять имена файлов, которые содержат пробелы и специальные символы, без использования find”

grep -E должен делать то, что вам нужно. Обратите внимание, что некоторые символы должны быть экранированы с обратной косой чертой, поэтому, если вы добавите больше, а результаты не то, что вы ожидали, убегите и повторите попытку. Обратите внимание на | это or

 $ ls | grep -E '\s|\*|\?|\$|%' all this.txt all?this.txt all*this.txt all%this.txt all th*s.txt all$.txt 
 printf '<%s>\n' *[[:space:]*?$%]* 

Он не будет сообщать о скрытых файлах. Будет ли [[:space:]] соответствовать многобайтовым символам интервала (например, " " ( EM QUAD ) в UTF-8) зависит от вашей оболочки (некоторые вроде dash не являются многобайтовыми символами)

Пример:

 $ touch sane 'a%b' $'with\nnewline' $'with space' $'with em-quad' $ printf '<%s>\n' *[[:space:]*?$%]* <a%b> <with em-quad> <with newline> <with space> 

Безопасный список файлов создается без кавычек * , не используется:

 $ 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?ba$ba*ba%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:]] , который будет включать в себя символы новой строки, пробела, табуляции и некоторые другие символы пробела как em-dash.

Поэтому команда становится:

 $ printf '%q\n' *[\?\$\*%[:space:]]* \? \$ \* % a\?b a\$b a\*b a%b $'em\342\200\201quad' has\ two\ spaces $'new\nline' 

Обратите внимание, что normal_file файлов clean и normal_file списке не указаны.

Это очень просто и работает уже с Bourne Shell с 1979 года:

 for i in * do case "$i" in *\ *) echo blank $i;; *\?*) echo qmark $i;; esac done 

в одной строке:

 for i in *; do case $i in *\ *|*\?*|*\**|*\$*|*%* ) echo "Special character $i"; ;; * ) echo "normal file $i"; ;; esac done 

Добавьте больше случаев, если хотите …

  • жадные и ленивые регулярные выражения (вопрос понимания)
  • Отображать скорость передачи при выполнении «cp» из командной строки?
  • Есть ли способ перехватить межпроцессное взаимодействие в Unix / Linux?
  • Переименуйте несколько файлов в несколько каталогов на имя каталога плюс 1
  • bash исчерпает память
  • Как запустить процесс и узнать, сколько памяти он использует?
  • путь к папке в папке в терминале
  • Неправильный вывод из cp, rm и т. Д.
  • Что может заставить мою оболочку выглядеть так?
  • Нет подсказки индикатора bash после завершения разветвленного процесса
  • Почему копируемый исполняемый файл rm не будет работать на другой Linux-машине?
  • Interesting Posts

    Как остановить github, всегда спрашивая имя пользователя / пароль?

    Shell script – команда всегда отображает использование перед выполнением

    Получить системное уведомление в определенное время?

    Есть ли способ узнать, какие веб-страницы доступны клиенту на веб-сервере UNIX?

    Проблемы с установлением соединения с wvdial

    почему lsb_release выглядит медленнее, чем программа, предназначенная для печати нескольких байтов?

    Как запустить скрипт после инициализации OpenVPN?

    Как автоматизировать загрузку последнего файла, загруженного в папку Google Диска?

    Как настроить параметры для файла unitd?

    Постоянно отключить режим gnome 3.2

    Как выбрать / удалить до конца файла в vim / gvim?

    Почему я не могу убить тайм-аут, вызванный с помощью скрипта Bash нажатием клавиши?

    fdisk не показывает мой жесткий диск как правильно отформатированный (но это так)

    Преобразование команды экрана для tmux

    Thunar: нет шаблонов в контекстном меню

    Linux и Unix - лучшая ОС в мире.