Как я могу использовать две команды bash в -exec команды find? WITH GREP

Ну, всегда есть head, tailи cut, но это может быть проще:

echo `ifconfig wlo1` | 
{ read a b c d e inet f netmask g broadcast h inet6 i ; echo $inet $inet6 ; }

Выход:

192.168.1.120 fe80::b400:3b2e:a40a:9f19

Примечания:

  • readназывает и устанавливает переменные одним выстрелом.a b c d eи т. д. являются фиктивными переменными, используемыми для поглощения нежелательного вывода ifconfig.

  • Как только запускается }, переменные перестают существовать. Так что поместите любой код, который использует эти переменные перед }.

0
08.11.2019, 06:21
2 ответа

Если вы хотите запустить fileдля каждого файла, а затем grepвывод из fileдля строкиJPEG:

find. -maxdepth 1 -type f -exec file {} + | grep JPEG

Это работает fileс пакетами обычных файлов, создавая поток вывода результатов. Этот поток затем фильтруется grepдля строк, содержащих конкретную строку JPEG. Обратите внимание, что имена файлов, содержащие новые строки, будут искажены в выходных данных этого конвейера.

Ваша команда в вопросе будет выполняться grepдля самих файлов, а не для вывода команды file. Ваша команда findтакже использует -iname "*", что не является операцией -, поскольку все имена файлов соответствуют этому предикату.

В качестве альтернативы, используйте bashдля циклического просмотра файлов в текущем каталоге:

shopt -s dotglob nullglob

for name in./*; do
    mimetype=$( file --brief --mime-type "$name" )
    if [[ $mimetype == */jpeg ]]; then
        printf '"%s" is a JPEG file\n' "$name"
    fi
done

Это будет использовать тип MIME -, сообщаемый для каждого файла в текущем каталоге с помощью file, чтобы отфильтровать имена, соответствующие файлам JPEG.

Немного расширенный пример:

shopt -s dotglob nullglob

for name in./*; do
    mimetype=$( file --brief --mime-type "$name" )
    case $mimetype in
        */jpeg)   printf '"%s" is a JPEG file\n'             "$name" ;;
        */png)    printf '"%s" is a PNG file\n'              "$name" ;;
        image/*)  printf '"%s" is some form of image file\n' "$name" ;;
        *)        printf '"%s" is not an image file\n'       "$name"
    esac
done

И, наконец, использование типа MIME -непосредственно вfind:

find. -maxdepth 1 -exec bash -c '[[ $(file -b --mime-type "$1") == */jpeg ]]' bash {} \; -print

или, более эффективно,

find. -maxdepth 1 -exec bash -c '
    for pathname do
        [[ $(file -b --mime-type "$pathname") == */jpeg ]] && printf "%s\n" "$pathname"
    done' bash {} +

Эти последние две команды просто распечатают имена путей, соответствующие изображениям JPEG.

3
28.01.2020, 02:22

Куса...-exec file {} + | grep...

Вашfind | file -f - | grep

А также это:

]# cat fhs.sh 
#/bin/bash
file -Nz * | grep "magic"

]# find. -exec./fhs.sh {} +
uout: very short file (no magic)

Кажется, все работает, используя одинаковое количество времени. Некоторые другие варианты также работают, но они занимают больше времени.


Обычно конструкция find... -exec grep xxx {} +очень эффективна (+вместо\;). Но здесь с fileвы «мешаете» именам файлов.

Итак, здесь ваш «плоский» (конвейерный )подход в порядке.

0
28.01.2020, 02:22

Теги

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