Используйте find
вместо ls
. С помощью find
вы можете исключить одно или несколько глобальных выражений. Для вашего примера (и OSX) вы можете сделать
find * -depth 0 -type f ! -name '*.ogg' -ls
, который выдаст что-то вроде ls -l
(только для файлов, учитывая -тип f
):
66294163 0 -rw-r--r-- 1 tom wheel 0 Sep 9 20:12 foo.mp4
With OSX, первый столбец - это значение inode, а затем счетчик ссылок. find
не предоставляет столько возможностей для листинга, сколько ls
:
$ ls -l
total 0
drwx------ 3 thomas wheel 102 Sep 9 15:33 com.apple.launchd.OFStJ79qtq
drwx------ 3 thomas wheel 102 Sep 9 15:33 com.apple.launchd.VQsV1ae6bI
drwx------ 3 thomas wheel 102 Sep 9 15:33 com.apple.launchd.e6HBMt2vnS
drwx------ 3 thomas wheel 102 Sep 9 15:33 com.apple.launchd.he9U4OAIMI
-rw-r--r-- 1 tom wheel 0 Sep 9 20:12 foo.mp4
-rw-r--r-- 1 tom wheel 0 Sep 9 20:12 foo.ogg
, но может быть полезным.
Вы хотите использовать grep для исключения совпадающих строк, а не для их включения? Если да, попробуйте:grep -v "Don't care about"
Требуется тщательное цитирование оболочки, но вы можете использовать редактор сценариев ed
для этого:
printf '%s\n' "/foo/ka" "??" "'a,.w "'!less' q | ed -s file
Это отправляет четыре команды наed
:
/foo/ka
--ищет (с начала файла )шаблон foo; в этом первом совпадении установите отметку с именем a
. ??
--повторить поиск, но в обратном направлении, до конца файла; важным побочным продуктом здесь является то, что он устанавливает текущую строку в это (последнее )совпадение. 'a,.w !less
--от метки с именем a
до текущей строки (.
), запишите эти строки в команду оболочки(!
)less
. q
--вышел изд. Вам нужно выйти less
корректно (q
), чтобы ed
вышел. Это решение предполагает, что шаблон существует хотя бы один раз в файле, иначе поиск завершится ошибкой, и вы получите три ?
перед выходом ed
.