当谈到快速转换一堆文件并随机重命名它们时,我使用一个非常简单的方法来执行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变量?
亲切的问候!
把它扔进一个循环中。
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 ''
。
根本不要使用find
;只需使用globstar
选项。
shopt -s globstar
for f in **/*.jpg **/*.png; do
convert [...] "$i" ../output/$RANDOM.jpg
done
我会使用其他答案中详述的shell循环,但知道如何在$RANDOM
命令中运行find -exec
这样的任意shell代码仍然很有用。你可以通过运行shell来实现:
find . \( -iname "*.jpg" -or -iname "*.png" \) \
-exec bash -c 'convert [...] "$1" "../output/$RANDOM.jpg"' _ {} \;