如何将多个文件从 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
这会初始化变量
n
n。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
find
在.
(当前)目录中,并且不深入到任何子目录(-maxdepth 1
),并且仅查看常规文件-type f
,并且仅返回名称与模式匹配的文件*.jpeg.jpg
,并打印它们的名称(默认情况下)。将 find 命令的输出通过管道传递给 sort 命令,以便它们按顺序排列(sort 可以处理非常大的标准输入)。将 sort 的输出通过管道传送到while
/循环,该循环会将输入的每一行逐行read
设置为变量。file
- 将名称存储在
file
变量中的文件移动到由变量命名的文件$n
,并与字符串“.jpeg.jpg”连接 - 增加变量 n
- 循环到下一个文件名。
您可以通过这种方式处理非常大的目录。它相当不受“怪异”(又名“不在可打印 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