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