Команда Awk внутри трубы внутри находки - PullRequest
0 голосов
/ 05 января 2019

Я хотел бы запустить следующий код:

find 2017_01_04/* -maxdepth 1 -mindepth 1 -type f -exec sh -c\
'file -i $1\ |  awk "{/video|audio/} {print \$1}" ' _ {} \; -print0 | \
while read -d $'\0' -r i
    echo $i
done

Вывод команды file -i это:

20170115_202630:                      image/jpeg; charset=binary
20170115_202630.jpg:                  image/jpeg; charset=binary
20171006_204647000_iOS.MOV:           video/quicktime; charset=binary
Ei*foto.jpg:                          image/jpeg; charset=binary
err-organiza_fotos (cópia).log:       text/plain; charset=utf-8
err-organiza_fotos.log:               text/plain; charset=utf-8
err-organiza_fotos (outra cópia).log: text/plain; charset=utf-8

Команда выше работает отлично! Но когда внутри find ... -exec sh -c '... | awk ...' _ {} \; -print0 | while ...; do ...; done не работает. Перепробовал все, что знаю, безуспешно.

file -i * | awk -F ":" '/image|video/ {print $1}'

Моя цель - найти файлы и выбрать только файлы определенного типа, не проверяя расширения, потому что, например, существуют файлы изображений без расширений. И я должен использовать find, потому что он лучше работает с файлами с разными именами, такими как ./ASD '[]ª\.*. И, наконец, я хотел бы, чтобы все было в одной команде, я знаю, что это возможно, используя силу awk и find.

Ответы [ 2 ]

0 голосов
/ 05 января 2019
Подобная команда

A find намного проще, чем for loop:

for f in 2017_01_04/*; do
  [ -f "$f" ] || continue
  file -i "$f" | awk '/video|audio/ {print $1}'
done

Я предполагаю, что дополнительные скобки из вашей команды awk были опечаткой, и цикл while, следующий за find, похоже, не служил какой-либо непосредственной цели. Каким бы ни было тело на самом деле (вместо echo "$i"), с такой же легкостью может быть следующий элемент конвейера в теле моего цикла for.

0 голосов
/ 05 января 2019

Так что разбейте его на что-то более простое и опирайтесь на это, например:

find -maxdepth 1 -mindepth 1 -type f -exec file -i {} \; | grep 'video\|image'

, который дает (в одном из моих собственных каталогов):

./20190102_104158.jpg: image/jpeg; charset=binary
./20190102_104158-1.jpg: image/jpeg; charset=binary
./20190102_104951-1.jpg: image/jpeg; charset=binary
./20190102_104212.jpg: image/jpeg; charset=binary
./20190102_104158-2.jpg: image/jpeg; charset=binary
./kitchen_sink_set.dwg: image/vnd.dwg; charset=binary
./20190102_104951.jpg: image/jpeg; charset=binary
./20190102_104212-1.jpg: image/jpeg; charset=binary
./20190102_104852.jpg: image/jpeg; charset=binary
./20190102_111832-1.jpg: image/jpeg; charset=binary
...