我已经找到了一个答案,其中列出了几乎所有内容。但我无法让它工作。
我用:
find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300{print $3}'
删除输出文件需要什么?
我尝试在末尾添加 | rm,但出现错误,显示我缺少操作数。我希望删除上述代码打印的所有文件。
有人可以帮忙吗
答案1
chmod +x ~/checksize.sh
下面的命令很有效,而且速度很快。保存到 ~/checksize.sh 并使用 chmod ( )使其可执行
#! /bin/bash
#find . -type f -exec bash -c ~/checksize.sh ;
echo ${@}
if [ -z "$1" ]
then
echo "\$1 empty" >&2
exit
fi
size=($(identify -format "%w %h" "$1" | tr -d "()"))
#echo ${size[@]}
#echo ${size[0]}
#echo ${size[1]}
if [ ${size[0]} -lt 300 -a ${size[1]} -lt 300 ]
then
rm -v "$1"
fi
然后将目录更改为要从中删除太小的文件的目录。
通过 cd 进入目录后,运行以下命令:find . -type f | xargs -P 0 -L 1 ~/checksize.sh
它运行速度很快,因为它使用了 xarg 的 -P 0,这使得它能够xarg
以最大并行度运行。有关详细信息,请参阅其手册页。
答案2
rm
不从输入中读取文件名。您可以这样做:
find . -iname "*.jpg" -type f -exec bash -c 'for i; do size=($(identify -format "%w %h" "$i")); (( size[1] < 300 || size[2] < 300 )) && rm -v "$i"' remove-files {} +
- 您可以使用
-exec
而不是xargs
。
bash 命令:
for i
do
size=($(identify -format "%w %h" "$i"))
(( size[0] < 300 || size[1] < 300 )) && rm -v "$i"
done
- 循环遍历所有输入参数 (
for i
) - 获取大小并将其存储在数组中(这就是为什么有括号
$()
:($(identify -format "%w %h" "$i"))
- 使用 shell 算法
(( ))
进行比较
答案3
您应该能够使用rm $(find...$3}')
。
换句话说,将上述命令包装在 $() 的括号内,以将结果用作 的参数rm
。
答案4
对于那些需要这种方式来处理当前 Bash 的人来说,这里是保存数组的现代化形式。
#!/bin/bash
for i in ./*.png; do
mapfile -d " " -t size < <( identify -format "%w %h" "$i" )
if [ "${size[0]}" -lt 1920 ] && [ "${size[1]}" -lt 1080 ]; then
rm -v "$i"
fi
done