自动重命名文件从 1 个到无限个

自动重命名文件从 1 个到无限个

如何将多个文件从 1 开始重命名为无限(完成所有文件)?

我的文件看起来像:

file.jpeg.jpg
fileA.jpeg.jpg
fileB.jpeg.jpg

输出:

1.jpeg.jpg
2.jpeg.jpg
3.jpeg.jpg

我正在使用 Cygwin,所以无法安装软件包

答案1

尝试:

n=0; for f in *.jpg; do mv "$f" "$((++n)).jpeg.jpg"; done

或者,同一件事分布在多行上:

n=0
for f in *.jpg
do
    mv "$f" "$((++n)).jpeg.jpg"
done

怎么运行的

  • n=0

    这会初始化变量nn。

  • for f in *.jpg; do

    这将启动一个循环,遍历当前目录中名称以.jpg.

  • mv "$f" "$((++n)).jpeg.jpg"

    这将根据需要重命名文件。在 bash 中,$((...))进行算术运算。在这里,我们让它n每次运行时都会递增。

  • done

    这标志着循环的结束。

即使存在名称包含空格、制表符、换行符或其他困难字符的文件,此代码也将起作用。

命令

该 globtest*.in被扩展为一个文件列表按字母顺序排列的命令。这记录在man bash

bash 扫描每个单词中的字符 *、? 和 [。如果出现这些字符之一,则该单词被视为一种模式,并且 替换为按字母顺序排序的列表与模式匹配的文件名(请参阅下面的模式匹配)。 [强调。]

请注意,字母排序的含义可能取决于您的区域设置。

答案2

j=0;
for i in `ls`
do
     mv $i $j.jpeg.jpg
     j=`echo $j + 1 | bc`
done

答案3

由于文件的数量可以是“无限的”,因此命令行的大小存在内置限制。看https://stackoverflow.com/questions/19354870/bash-command-line-and-input-limit。因此,我会用它find来解决这个问题。例如,在 bash 中:

cd /path/to/directory
n=1
find . -maxdepth 1 -type f -name "*.jpeg.jpg" | sort |  while read file; do
    mv "$file" $n.jpeg.jpg
    let n=n+1
done

步骤如下,逐行:

  1. 切换到合适的目录
  2. 将文件计数器设置为 1
  3. find.(当前)目录中,并且不深入到任何子目录(-maxdepth 1),并且仅查看常规文件-type f,并且仅返回名称与模式匹配的文件*.jpeg.jpg,并打印它们的名称(默认情况下)。将 find 命令的输出通过管道传递给 sort 命令,以便它们按顺序排列(sort 可以处理非常大的标准输入)。将 sort 的输出通过管道传送到while/循环,该循环会将输入的每一行逐行read设置为变量。file
  4. 将名称存储在file变量中的文件移动到由变量命名的文件$n,并与字符串“.jpeg.jpg”连接
  5. 增加变量 n
  6. 循环到下一个文件名。

您可以通过这种方式处理非常大的目录。它相当不受“怪异”(又名“不在可打印 ASCII 集中的字符”)文件名的影响。它可以变得更加免疫,但我猜这对于这种情况可能是不必要的(它涉及使用选项-print0,可能还涉及xargs命令)。

答案4

当您按字母顺序列出新文件时(如 的输出所示),此版本将使新文件保持相同的顺序ls

#!/bin/sh
i=0
for f in *.jpeg.jpg
do
     mv "$f" "$(printf '%011d.jpeg.jpg' $i)"
     i=$(expr $i + 1)
done

相关内容