当涉及快速转换一堆文件并随机重命名它们时,我使用一种非常简单的方法通过for循环来做到这一点:
for i in *; do convert [...] $i ../output/$RANDOM.jpg; done
那样容易。 imagemagick在这里所做的细节在这里并不重要。它按预期工作。这只是关于如何处理bash的内容。
现在,我目前的情况是该文件夹不仅包含照片,而且还包含带有其他照片的子文件夹。再次出现的预期现象是,所有照片均被随机重命名,输出文件被合并到一个文件夹中。
由于我不知道使用for递归循环的方法,因此我在这里使用find结构。
find . \( -iname "*.jpg" -or -iname "*.png" \) -exec convert [...] {} ../output/$RANDOM.jpg \;
问题是$ RANDOM只会被调用一次,因此它在整个过程中保持不变,并且图像一次又一次被覆盖。因此,实际上输出文件夹只处理一个图像,最后处理的是一个图像。
所以问题是: 如何使$ RANDOM变量随每个新文件更改?
亲切的问候!
答案 0 :(得分:4)
将其放入循环中。
find . \( -iname "*.jpg" -or -iname "*.png" \) -type f -print0 |
while read -d '' -r f
do convert [...] "$f" ../output/$RANDOM.jpg # copied mostly from your find above
done
如果您从未在文件名中嵌入换行符,则不需要-print0
和read -d ''
。
答案 1 :(得分:2)
完全不使用find
;只需使用globstar
选项即可。
shopt -s globstar
for f in **/*.jpg **/*.png; do
convert [...] "$i" ../output/$RANDOM.jpg
done
答案 2 :(得分:2)
我会使用其他答案中详细介绍的shell循环,但是了解如何在$RANDOM
命令中运行像find -exec
这样的任意shell代码仍然很有用。您可以通过运行Shell来实现:
find . \( -iname "*.jpg" -or -iname "*.png" \) \
-exec bash -c 'convert [...] "$1" "../output/$RANDOM.jpg"' _ {} \;