我想运行以下代码:
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的功能来实现。
答案 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
循环主体中管道的下一个成员。