【问题标题】:Awk command inside pipe inside find查找内部管道内的 awk 命令
【发布时间】:2019-01-05 02:50:10
【问题描述】:

我想运行以下代码:

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 的力量是可能的。

【问题讨论】:

标签: bash shell awk grep find


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

【讨论】:

  • 是的,你是对的,因为要简单得多。我将简化我的代码。 Find 不适合处理文件名,我认为相反。我想,我的 awk 中的额外大括号不是错字,它们是必要的,因为 sh -c 命令需要单个逗号。 find 之后的 while 绝对是创建循环所必需的。使用查找结果,即使您放入变量,它们也不会分成行,然后您不能在 for 循环中使用。但是您的解决方案更好、更简单,谢谢。
【解决方案2】:

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

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

【讨论】:

  • 这样效果更好。我试图在同一个命令中做所有事情,但我意识到这并不好,有很多例外要处理。例如,在我的命令中,while 创建了一个子shell。我将拆分我的代码。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多