如何在目录中随机打乱文件名

Ped*_*dsB 4 linux bash filenames rename random

假设我有一个文件名目录:

  • 文件_010.ext
  • 文件_011.ext
  • ...
  • 文件_99.ext

获取每个文件并将其随机重命名为目录中的任何其他名称而不存在任何重复的最简单方法是什么,以便在检查时目录看起来相同但内容已重新排列?

ilk*_*chu 5

shuf这是GNU coreutils 中的一个使用:

paste <(printf "%s\n" *) <(printf "%s\n" * | shuf) |
  while IFS=$'\t' read -r from to; do mv -- "$from" "$to.new"; done

for f in *.new; do mv -- "$f" "${f%.new}"; done 
Run Code Online (Sandbox Code Playgroud)

printf "%s\n" *创建文件名列表,shuf对它们进行随机排列。paste组合两个列表,以便在一列中存在按顺序排列的文件名列表,在另一列中存在按打乱顺序排列的文件名列表。(如果您不想像上面那样使用进程替换,您可以在临时文件中构建列表;另外,如果您的 shell 不支持,则替换IFS=$'\t'为。)IFS=$(printf '\t')$''

然后将其输入循环while read,我们根据列表重命名文件,添加后缀以不覆盖任何旧文件。第二个循环只是删除后缀。

上面假设文件名不包含制表符或换行符。

(你可以在 shell 中手动实现shuffle 算法,但我认为它有点混乱。)