В этом случае GNU find
позволяет вам делать все эти вещи за один раз, устраняя каналы и потенциально проблемный анализ ls
:
find . -maxdepth 1 -name '[^.]*' \
-regextype posix-extended -regex "MYPATTERN" \
-printf 'SOMEPREFIX %f SOMESUFFIX\n'
( find
конечно, это не хороший способ произвольно изменить вывод других команд!)
Некоторые заметки:
-maxdepth 1
и -name [^.]*
заставить сопоставление имен работать так же, как обычный ls
(или ls .
). Вы можете использовать любой глобус в стиле оболочки, но учтите, что «*» будет соответствовать лидирующему «.» в имени † в отличие от bash
, значит [^.]*
означает что-либо, что не имеет лидирующего "."
- MYPATTERN - это правильный POSIX ERE (тип по умолчанию - Emacs, см. Здесь ), но он должен соответствовать всему имени файла, поэтому используйте что-то вроде,
.*thing.*
а не простоthing
- вы, вероятно, можете просто использовать один из
-name
/ -regex
вместо обоих (например, -regex "[^.]. MYPATTERN. "
-printf
поддерживает много вещей , %n
является неукрашенным имя файла или каталога
† (это может зависеть от вашей версии, find
хотя, проверьте раздел «СТАНДАРТНОЕ СООТВЕТСТВИЕ» вашей справочной страницы)
В качестве возможной альтернативы без каких - либо внешних программ , необходимых, bash
есть , compgen
которые, помимо всего прочего, расширяет шарики, что эквивалентно ls
без опций:
compgen -P "someprefix>" -S "<somesuffix" -G "pattern"
Это обрабатывает имена файлов с пробелами, включая переводы строк. compgen -G "*"
должен обеспечивать тот же вывод, что и обычный ls
(но обратите внимание, что ls *
это совсем другое). Вам все еще нужно grep
, и это может или не может решить проблему, но стоит упомянуть.
ls
- это плохо, джиу. Кроме того, это должно бытьgrep
? И можете ли вы привести пример вывода?