Ну, всегда есть 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
.
Как только запускается }
, переменные перестают существовать. Так что поместите любой код, который использует эти переменные перед }
.
Если вы хотите запустить 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.
Куса...-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
вы «мешаете» именам файлов.
Итак, здесь ваш «плоский» (конвейерный )подход в порядке.