find . -type f -name "CMakeLists*" -exec grep lib /dev/null {} +
Эта команда находит файлы в текущем каталоге, чье базовое имя начинается или является строкой CMakeLists
. Аргумент экранирован (двойные кавычки), чтобы оболочка не раскрывала его до выполнения find
.
Нет необходимости добавлять cat
с конвейером к grep
- здесь это бесполезный процесс с бесполезным вводом-выводом. Добавление / dev / null
гарантирует, что grep
сообщит имя файла вместе с совпадающими строками, когда есть более одного файла для сопоставления.
Используя {} +
в качестве завершающей последовательности для аргумента -exec
, при каждом вызове команды grep
передается несколько имен файлов. Если бы мы использовали {} \;
, то процесс grep
создавался бы для каждого найденного файла . Излишняя инстанциация процесса стоит дорого, если выполняется сотни или тысячи раз.
Чтобы использовать канал с аргументом find
-exec
, необходимо вызвать оболочку. Надуманным примером может быть grep
для строки «один», но только если строка «два» также отсутствует. Это можно сделать так:
find . -type f -name "CMakeLists*" -exec sh -c 'grep one "$@"|grep -v two' sh {} +
Это основано на комментариях, приведенных ниже, @muru, @Serg и @Scott, с благодарностью.
В zsh
:
open A000*.png([1,10])
для первых 10.
В bash
вы всегда можете сделать:
files=(A000*.png)
open "${a[@]:0:10}"
Или в цикле:
while ((${#files[@]})); do
open "${files[@]:0:10}"
files=("${files[@]:10}")
done
Это также будет работать в zsh
, хотя и в zsh
, вы могли бы сделать это с немного менее неудобным синтаксисом:
while (($#files)) {
open $files[1,10]
files[1,10]=()
}
Другой вариант - использовать xargs
:
printf '%s\0' A000*.png | xargs -0n10 open
Хотя это влияет на стандартный ввод open
. zsh
имеет функцию zargs
с аналогичными функциями:
autoload zargs # in ~/.zshrc
zargs -n 10 A000*.png -- open
Это позволяет вам определить, что open
как функция, которая должна делать с ними все, что вы хотите. 10 файлов, например:
open() {
image_viewer $argv
read -q '?continue? ' || return 255
}
Используя цикл и перехватывая пользовательский ввод, можно получить:
#!/bin/bash
# Store all list of files you want with extension png
arr=(./*.png)
for ((i=0; i<${#arr[@]};))
do
# -s: do not echo input character
# -n 1: read only 1 character (separate with space)
read -s -n 1 key
for ((j=0; j<10; j++, i++))
do
if [[ $key = "" ]]; then
open "${arr[$i]}"; # <--- This is where you will open your file.
fi
done
done