我想和如何在-查找命令中使用两个bash命令的主管?一样,但是使用grep作为第二个命令。当grep是第二个命令时,为该先前解决方案发布的解决方案不起作用。另一个问题查找和grep命令与exec选项的结合询问使用grep,但所有的答案都不使用grep。我想我需要格里普。
例如,
sudo find -D exec . -maxdepth 1 -type f -iname "*" -exec file -N '{}' \; -exec echo 'asdf' \;很好,但是
sudo find -D exec . -maxdepth 1 -type f -iname "*" -exec file -N '{}' \; -exec grep "JPEG" {} \;没有证据表明grep做了什么。如何强制第一个命令的stdout用于grep?如果我用管道将文件命令输出到一个文件中,然后在该文件上单独运行grep,那么它工作得很好:
dell@DELL-E6440:~$ rm junk.txt
dell@DELL-E6440:~$ sudo find -D exec . -maxdepth 1 -type f -iname "*" -exec file -N '{}' >> junk.txt \;
dell@DELL-E6440:~$ grep "JPEG" junk.txt
./150120-ssc-proxy~20190508-061623.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 150x150, segment length 16, baseline, precision 8, 1018x1426, frames 3
./avoid-powered-overfight~20190508-061623.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, comment: "Intel(R) JPEG Library, version [2.0.16.48]", baseline, precision 8, 1048x659, frames 3
dell@DELL-E6440:~$但关键是,我想在一个bash行上这样做,而且>>在运行过程中没有正确地刷新文件。
发布于 2019-11-08 07:22:20
如果希望对每个文件运行file,然后对字符串JPEG的file输出进行grep:
find . -maxdepth 1 -type f -exec file {} + | grep JPEG这将在批常规文件上运行file,生成结果输出流。然后,grep对包含特定字符串JPEG的行进行筛选。请注意,包含换行符的文件名将在此管道的输出中被错误地表示。
问题中的命令将在文件本身上运行grep,而不是在file命令的输出上运行。您的find命令还使用-iname "*",因为所有文件名都与该谓词匹配,这是一个非操作。
或者,使用bash循环当前目录中的文件:
shopt -s dotglob nullglob
for name in ./*; do
mimetype=$( file --brief --mime-type "$name" )
if [[ $mimetype == */jpeg ]]; then
printf '"%s" is a JPEG file\n' "$name"
fi
done这将使用file为当前目录中的每个文件报告的MIME类型来筛选出对应于JPEG文件的名称。
一个稍微扩展的例子:
shopt -s dotglob nullglob
for name in ./*; do
mimetype=$( file --brief --mime-type "$name" )
case $mimetype in
*/jpeg) printf '"%s" is a JPEG file\n' "$name" ;;
*/png) printf '"%s" is a PNG file\n' "$name" ;;
image/*) printf '"%s" is some form of image file\n' "$name" ;;
*) printf '"%s" is not an image file\n' "$name"
esac
done最后,在find中直接使用MIME类型:
find . -maxdepth 1 -exec bash -c '[[ $(file -b --mime-type "$1") == */jpeg ]]' bash {} \; -print或者,更有效,
find . -maxdepth 1 -exec bash -c '
for pathname do
[[ $(file -b --mime-type "$pathname") == */jpeg ]] && printf "%s\n" "$pathname"
done' bash {} +最后两个命令将只打印出与JPEG图像对应的路径名。
发布于 2019-11-08 04:35:26
将两个命令包装到find命令中并不是最好的主意。相反,我从find内部展开这两个操作,而是通过管道对它们进行排序。
$ sudo find . -type f | file -Nz -f - | grep -f ~/badtypes.txt这给了我一种使用file命令进行递归的方法,并找到不属于计算机的任何类型的文件,不管它们是重命名还是压缩。我想知道为什么file命令没有recurse选项。
发布于 2019-11-08 09:39:18
Kusa的...-exec file {} + | grep ...
你的find | file -f - | grep
此外,这也是:
]# cat fhs.sh
#/bin/bash
file -Nz * | grep "magic"
]# find . -exec ./fhs.sh {} +
uout: very short file (no magic)所有这些似乎都有效,使用了相同的时间。其他一些变体也有效,但它们需要更长的时间。
通常,find ... -exec grep xxx {} +结构非常有效( +而不是\;)。但是在这里,使用file,您可以“干扰”文件名。
因此,在这里,您的“平面”(管道)方法是可以的。
https://unix.stackexchange.com/questions/551066
复制相似问题