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

时间:2019-03-04 17:15:02

标签: bash random find

当涉及快速转换一堆文件并随机重命名它们时,我使用一种非常简单的方法通过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变量随每个新文件更改?

亲切的问候!

3 个答案:

答案 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

如果您从未在文件名中嵌入换行符,则不需要-print0read -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"' _ {} \;