如何在bash脚本中使用find exec时随机命名文件?

问题描述 投票:1回答:3

当谈到快速转换一堆文件并随机重命名它们时,我使用一个非常简单的方法来执行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变量?

亲切的问候!

bash random find
3个回答
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

如果您从未在文件名中嵌入换行符,则不需要-print0read -d ''


2
投票

根本不要使用find;只需使用globstar选项。

shopt -s globstar
for f in **/*.jpg **/*.png; do
  convert [...] "$i" ../output/$RANDOM.jpg
done

2
投票

我会使用其他答案中详述的shell循环,但知道如何在$RANDOM命令中运行find -exec这样的任意shell代码仍然很有用。你可以通过运行shell来实现:

find . \( -iname "*.jpg" -or -iname "*.png" \) \
    -exec bash -c 'convert [...] "$1" "../output/$RANDOM.jpg"' _ {} \;
© www.soinside.com 2019 - 2024. All rights reserved.