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循环中使用。但是你的解决方案更好,更简单,谢谢。