У цьому випадку 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? І чи можете ви навести приклад?