查找管道内的AWK命令

时间:2019-01-05 02:50:11

标签: bash shell awk grep find

我想运行以下代码:

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 :(得分:1)

因此,将其分解为更简单的内容,并基于此进行构建:

<html>
  <head>
  </head>
       <body>
              ion_auth
        </body>
</html>

给出(在我自己的目录之一中):

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

答案 1 :(得分:1)

find这样的for命令要简单得多:

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循环主体中管道的下一个成员。