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

在bash脚本中使用find exec时,如何随机命名文件?,bash,random,find,Bash,Random,Find,当涉及到快速转换一堆文件并随机重命名它们时,我使用了一种非常简单的方法来实现for循环: for i in *; do convert [...] $i ../output/$RANDOM.jpg; done 就这么简单。imagemagick在这里所做的细节在这里并不重要。它按预期工作。这只是关于如何处理bash的事情 现在,我的当前案例文件夹不仅包含照片,它还包含自己有其他照片的子文件夹。预期的行为是再次随机重命名所有照片,并将输出文件合并到单个文件夹中 因为我不知道如何递归循环for,所

当涉及到快速转换一堆文件并随机重命名它们时,我使用了一种非常简单的方法来实现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 . \( -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

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

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

我将使用shell循环,如其他答案中所详细说明的,但知道如何在
find-exec
命令中运行任意shell代码(如
$RANDOM
)仍然很有用。您可以通过运行shell来实现这一点:

find . \( -iname "*.jpg" -or -iname "*.png" \) \
    -exec bash -c 'convert [...] "$1" "../output/$RANDOM.jpg"' _ {} \;

我将使用shell循环,如其他答案中所详细说明的,但知道如何在
find-exec
命令中运行任意shell代码(如
$RANDOM
)仍然很有用。您可以通过运行shell来实现这一点:

find . \( -iname "*.jpg" -or -iname "*.png" \) \
    -exec bash -c 'convert [...] "$1" "../output/$RANDOM.jpg"' _ {} \;

如果调用
$RANDOM
,最多可以得到32768个唯一的文件名。您很可能会在这之前覆盖以前的文件。您可能想改用类似于
tempfile
的东西。您可以执行
-exec bash-c…
您是否使用了
bash
的现代版本(4.0或更高版本,在过去十年左右发布)?将PNG重命名为
$RANDOM.jpg
是否重要?如果调用
$RANDOM
,最多可获得32768个唯一文件名。您很可能会在这之前覆盖以前的文件。您可能想使用类似于
tempfile
的东西。您可以执行
-exec bash-c…
您使用的是
bash
(4.0或更高版本,在过去十年左右发布)的合理现代版本吗?是否将PNG重命名为
$RANDOM.jpg