Intereting Posts
Предварительный автолог через 2 jumphost / passphrase скопировать все файлы, не имеющие расширения Как изменить звук входа в систему linux mint 11? применить темы zsh вручную Монетный двор 17: сенсорная панель распознана как мышь Карта DNS-запросов, поступающих с определенного клиентского MAC с помощью dnsmasq Как подключиться к Wi-Fi из командной строки? Пакетный файл перемещается в структуру каталогов на основе имени файла Как отображать эскизы для файлов контактов / vcf / vcard в Nautilus или в другом браузере файлов в Ubuntu 14.04? Как предотвратить `rlwrap` от сохранения пароля в файле входных данных? chcon: не может применяться частичный контекст к немаркированному файлу '/ usr / sbin / xrdp' Правильный способ реализации SSL на локальном хосте Как монтировать контейнер cryptsetup только с `mount`? Невозможно правильно загрузиться после переноса всех файлов, а затем обратно на мой VM-диск Недопустимая обратная ссылка с использованием grep

регулярное выражение в `/ bin / sh` shell

Я хотел бы удалить все файлы, заканчивающиеся заданным набором расширений в определенном каталоге в оболочке /bin/sh . С помощью /bin/bash я могу сделать это с помощью regex следующим образом:

 rm path/(*.pdf|*.png) 

но это, похоже, не работает с обычным sh. Это нормально? Есть ли support регулярных выражений?

Нет, это не будет работать в строго совместимой с POSIX оболочке. Вот нормативная ссылка:

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13_03

Как вы можете видеть, определенно нет регулярных выражений, и даже не обозначать скобки {a, b}.

Как указано в ответе user3188445, это не соответствует POSIX.

Однако, если вы все равно хотите это сделать, вам нужно использовать другой инструмент, например find :

 find dir/ -maxdepth 1 -type f -regex ".*.pdf\|.*.png" -delete 

find поиск в -maxdepth 1 dir/ , а не рекурсивно ( -maxdepth 1 ), найден только файл ( -type f ). Регулярное выражение соответствует файлам .pdf и .png и -delete удаляет найденные файлы.

Чтобы проверить, какая оболочка вы действительно используете с / bin / sh, вызовите:

 /bin/sh whatshell.sh 

и выберите сценарий whatshell с этой страницы:

http://www.in-ulm.de/~mascheck/various/whatshell/

звоните, например, wget http://www.in-ulm.de/~mascheck/various/whatshell/whatshell.sh

Типичный выход:

 $ sh whatshell.sh SVR4 Bourne shell (SunOS 5 variant) $ bosh whatshell.sh SVR4 Bourne shell (SunOS 5 schily variant) $ bash whatshell.sh bash 3.2.25(1)-release $ ksh whatshell.sh ksh88 Version (..-)11/16/88i $ ksh93 whatshell.sh ksh93 Version M 1993-12-28 s+ 

POSIX не требует оболочки POSIX в / bin / sh. Если вам нравится запускать вызов оболочки POSIX:

 PATH=`getconf PATH` export PATH sh 

обратите внимание, что если это приведет к запуску bash, оболочка не будет совместима с POSIX.