Как открыть первые 10 файлов в папке, начинающиеся с определенной буквы или цифры?

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, с благодарностью.

1
09.03.2017, 22:56
2 ответа

В 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
}
3
27.01.2020, 23:19

Используя цикл и перехватывая пользовательский ввод, можно получить:

#!/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
1
27.01.2020, 23:19

Теги

Похожие вопросы