Bash Awk命令在管道内部查找

Bash Awk命令在管道内部查找,bash,shell,awk,grep,find,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

我想运行以下代码:

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
上面的命令运行良好!但是当在
中查找时-执行官sh-c'…|啊…{}-打印0 |而。。。;做完成
不起作用。尝试了我所知道的一切,没有成功

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

我的目标是能够找到文件并只选择某一类型的文件,而不必检查扩展名,因为,例如,存在没有扩展名的图像文件。我必须使用find,因为它可以更好地处理具有不同名称的文件,如
/ASD'[]。最后,我希望所有东西都只需一个命令,我知道使用awk和find的强大功能是可能的。

因此,请将其分解为更简单的内容,并在此基础上进行构建,例如:

find -maxdepth 1 -mindepth 1 -type f -exec file -i {} \; | grep 'video\|image'
其中给出(在我自己的一个目录中):


因此,将其分解为更简单的内容,并在此基础上进行构建,例如:

find -maxdepth 1 -mindepth 1 -type f -exec file -i {} \; | grep 'video\|image'
其中给出(在我自己的一个目录中):


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

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

检查此答案:检查此答案:效果更好。我试着用同一个命令来做每件事,但我意识到这是不好的,有很多例外需要处理。例如,在我的命令中,while创建子shell。我将拆分我的代码。谢谢。这个效果更好。我试着用同一个命令来做每件事,但我意识到这是不好的,有很多例外需要处理。例如,在我的命令中,while创建子shell。我将拆分我的代码。谢谢。是的,你说得对,因为它要简单得多。我要简化我的代码。Find不适合处理文件名,我认为正好相反。我想awk中额外的大括号不是打字错误,它们是必要的,因为sh-c命令需要一个逗号。while-after-find对于创建循环是绝对必要的。使用find结果,即使将其放入变量中,它们也不会被划分为行,因此不能在for循环中使用。但是你的解决方案更好,更简单,谢谢。是的,你是对的,因为它更简单。我要简化我的代码。Find不适合处理文件名,我认为正好相反。我想awk中额外的大括号不是打字错误,它们是必要的,因为sh-c命令需要一个逗号。while-after-find对于创建循环是绝对必要的。使用find结果,即使将其放入变量中,它们也不会被划分为行,因此不能在for循环中使用。但是你的解决方案更好,更简单,谢谢。