В этом случае 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? И можете ли вы привести пример вывода?