Как выбрать файлы в сценарии bash, у которых нет расширения?

Предположим, у меня есть файлы xinitrc, alphabetsoup, ieat.pie в текущем каталоге. Вам нужен скрипт bash для выбора только xinitrc и alphabetsoup.

4 Solutions collect form web for “Как выбрать файлы в сценарии bash, у которых нет расширения?”

Баш расширенный glob +([^.]) Будет соответствовать файлам без каких-либо . от их имени. Это требует, чтобы вы не shopt extglob (в современных установках bash, он должен быть установлен по умолчанию). Образец означает:

любое число (но не менее одного) символов, отличных от .

Вы можете поместить все имена файлов в массив:

 NO_EXTENSION=( +([^.]) ) 

Вы можете распечатать имена файлов:

 printf "%s\n" +([^.]) 

Или передайте их всем утилите:

 ls -- +([^.]) 

Если вы хотите, чтобы они были в переменной, но не в массиве, вы должны быть уверены, что у файла нет пробелов в имени. Если вы абсолютно уверены в этом, вы можете сделать:

 NO_EXTENSION=$(echo +([^.])) 

Вызов эха необходим для того, чтобы получить расширение имени пути, в отличие от случая массива. Я настоятельно рекомендую использовать массивы для такого списка, потому что вам не нужно беспокоиться о специальных символах в именах файлов.

Вы можете получить список файлов без полной остановки в своих именах в рабочем каталоге с помощью:

 find . -maxdepth 1 ! -name "*.*" 

Вы также можете иметь файлы, которые являются .file в unix, если вы хотите сопоставить их и file , но не file.ext то вы можете использовать:

 find . -maxdepth 1 ! -name "*.*" -o -name ".*[^.]*" 

С опцией extglob вы можете сопоставить дополнение к шаблону, то есть файлы, имя которых не соответствует шаблону. Файлы с расширениями – это те, которые соответствуют *.* , Поэтому файлы без расширения в текущем каталоге могут быть сопоставлены следующим образом:

 shopt -s extglob somecommand !(*.*) 

Обратите внимание, что файлы точек (файлы, чье имя начинается с . ) Не будут включены. Если вы хотите также их сопоставить и относитесь к ним как к неограниченному, если они не содержат второго . , вы можете использовать

 shopt -s extglob nullglob somecommand !(*.*) .!(*.*) 

или

 shopt -s dotglob extglob somecommand !(?*.*) 

Возможно, вы ищете это:

 $ ls | grep -v '\.' 

Пример:

 $ ls alphabetsoup ieat.pie xinitrc $ ls | grep -v '\.' alphabetsoup xinitrc 
  • Переменная в Bash, содержащая кавычки и пробелы
  • Папка псевдонимов исполняемых файлов с добавленным ключевым словом
  • Linux find-command пропускает каталог
  • Расширение *, #,% - Что они означают?
  • Cronjob не выполняет сценарий оболочки, но когда я выполняю его автономно, он работает. Зачем?
  • Назначение команды массиву в сценарии оболочки не работает?
  • WTH - команда не найдена - оператор if - bash
  • bash escape восклицательный знак внутри переменной с backtick
  • Сценарий оболочки для ssh на сервер Unix / Linux из MacOS X 10.10
  • Установите переменные переменных переменных в bash (или другие)
  • Сценарий OSX bash для запуска один раз на Terminal.app open
  • Linux и Unix - лучшая ОС в мире.