如何随机重命名文件

时间:2019-05-06 17:10:14

标签: linux bash ubuntu

这里我有名为1(1).jpg,1(2).jpg,1(3).jpg .....的图像文件 我想使用.sh文件在Linux中使用Corn Job重命名此文件 括号()中的数字应更改,其他应保持不变

例如

重命名1(1).jpg之前 重命名1(2).jpg后

和之前的1(2).jpg应该重命名为其他任何数字1(x).jpg:x是更改的值,文件数应该相同且不能覆盖

我该怎么做

我只是将它们重命名为

3 个答案:

答案 0 :(得分:0)

这并不是真正随机的,但也许足以满足您的需求:

n=1; for i in 1\ \(*.jpg; do : $((n+=$RANDOM%5 + 1 )); echo mv -i "$i" "1 ($n).new.jpg"; done

(首先对echo执行,如果对结果满意,则省略'echo'。然后根据需要重命名,并删除“ .new”。)

答案 1 :(得分:0)

我会这样做:

  1. 创建一个临时目录tmpdir
  2. 将现有文件列表放入数组source
  3. 将数组改组为另一个dest
  4. 对于源数组的每个索引:mv "${source[i]}" "$tmpdir/${dest[i]}"
  5. 然后,将所有文件从tmpdir移到当前目录。

答案 2 :(得分:0)

不是理想的效率。欢迎提出建议。
这仅假设一位数字,效率会下降,因为必须存在一些未使用的数字,但效率会下降,但是它是随机选择而不是缓存不发火。

printf "%s\n" "1 ("?").jpg" |
while IFS=')(' read a b c
do n=$(($RANDOM%10))
   while [[ -e "$a($n)$c" ]]
   do n=$(($RANDOM%10))
   done
   mv "$a($b)$c" "$a($n)$c"
done

这会更有效,但不是随机的,而是希望使用最低的可用插槽。

for ndx in {0..9}
do [[ -e "1 ($ndx).jpg" ]] && used[$ndx]=1 || used[$ndx]=0
done

printf "%s\n" "1 ("?").jpg" |
while IFS=')(' read a b c
do for ndx in {0..9}
   do if (( used[$ndx] ))
      then continue
      else mv "$a($b)$c" "$a($ndx)$c"
           used[$b]=0
           used[$ndx]=1
           break
      fi
   done
done