Как я выбираю файлы в сценарии удара, которые не имеют расширения?

Вы неправильно понимаете chroot несколько; это просто не скрывает материал, тот каталог на самом деле становится / для сессии. Необходимо предоставить изображение довольно полной системы (/etc, /bin, /lib, и т.д.) под ним, или ничто не будет работать (в частности, у пользователя не будет оболочки для выполнения). root будучи должен владеть новым / последствие этого: кто-либо еще владеющий корнем файловой системы был бы очевидной проблемой безопасности.

6
23.08.2013, 00:22
4 ответа

Удар расширил шарик +([^.]) будет соответствовать файлам ни с кем. на их имя. Это требует, чтобы Вы не сбрасывали shopt extglob (на современных установках удара это должно быть установлено по умолчанию). Средства шаблона:

любое число (но по крайней мере один) символов кроме.

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

NO_EXTENSION=( +([^.]) )

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

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

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

ls -- +([^.])

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

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

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

7
27.01.2020, 20:22
  • 1
    я пытаюсь установить переменную в сценарии удара. Таким образом, что files=*.[nothing]. –  pedram 21.08.2013, 19:54
  • 2
    @multiphrenic: затем вышеупомянутое будет работать. –  rici 21.08.2013, 21:09

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

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

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

find . -maxdepth 1 ! -name "*.*" -o -name ".*[^.]*"
5
27.01.2020, 20:22
  • 1
    Вы второй будет включать точечные файлы, которые имеют по крайней мере один неточечный символ. Вам нужно \( -name '.?*' ! -name '.*.*' \). –  Stéphane Chazelas 23.08.2013, 00:29

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

shopt -s extglob
somecommand !(*.*)

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

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

или

shopt -s dotglob extglob
somecommand !(?*.*)
3
27.01.2020, 20:22

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

$ ls | grep -v '\.'

Пример:

$ ls
alphabetsoup  ieat.pie  xinitrc
$ ls | grep -v '\.'
alphabetsoup
xinitrc
0
27.01.2020, 20:22
  • 1
    Никогда не анализируйте ls, он ведет для беспокойства. –  terdon♦ 22.08.2013, 01:36
  • 2
    @terdon, если намерение состоит в том, чтобы сохранить список в скалярной переменной так или иначе, это лучше, чем принятое решение, которое использует echo. –  Stéphane Chazelas 23.08.2013, 00:31

Теги

Похожие вопросы