![重命名/重新枚举目录中的文件](https://linux22.com/image/1467655/%E9%87%8D%E5%91%BD%E5%90%8D%2F%E9%87%8D%E6%96%B0%E6%9E%9A%E4%B8%BE%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6.png)
在某些目录中我有许多名为
...
DSC_0002DSC_0005DSC_0010 ...
我想重命名/重新编号文件
文件_0001
文件_0002
...
也许我需要从 0001 开始编号
答案1
假设包含这些文件的目录是 /path/to/dir,
您需要的脚本将如下所示:
start=1
cd "/path/to/dir"
for file in ./*;do
mv "${file}" "FILE_$(printf "%04d" $start)"
start=$((start+1))
done
答案2
尝试
ls | awk '{printf "mv %s FILE_%04d\n",$0,NR ;} ' | bash
- 确保没有文件有奇怪的名称。
remove |
bash 部分进行预览。- 使用
NR+666
从 667 开始。 - 使用
%02d
或%06d
生成如图所示的 01 或 000001。
答案3
您可以执行以下操作:
#!/bin/bash
Counter=${1:-1} # It will take the starting number as 1st parameter
WhichDir=${2:-.} # It will take the path as 2nd parameter
# We try to see if the directory exists and if you can go there
(cd "$WhichDir" 2>/dev/null) || { echo "# $WhichDir NOT FOUND " ; exit 1; }
cd "$WhichDir" # it exists and you can go there
shopt -s nullglob # see notes
for f in DSC_* # for all the files in this dir
do
New_Name=$(printf "FILE_%04d.jpg" $Counter)
# change .jpg in what you need
Counter=$(($Counter +1)) # increase the counter
echo "mv -i \"$f\" \"$New_Name\" " # the -i will prompt before overwrite
# mv -i "$f" "$New_Name" # uncomment this line to make it works
exit 0
笔记
- 当你玩with
mv
可能很危险。它可以覆盖现有文件。它可以移动/重命名目录。因此,最好在执行脚本之前进行目视检查。然后,您可以将其输出通过管道传输到 shell 中:
例如./Myscript.sh
,一切正常吗?如果是,那么您可以写入./Myscript.sh | /bin/bash
(或者您可以修改它,删除以下行中的“echo”或注释)。 - 最好这样写
mv -i
:覆盖前会提示 DSC_*
如果当前目录中没有文件shopt -s nullglob
,则将避免扩展错误。一般来说解析是不安全的输出
ls
即使在您的情况下这也不应该是一个真正的问题,因为您应该为文件使用来自相机的标准名称DSC_nnnn.jpg
。- 通常有一个扩展(可能
.jpg
或.tif
或.raw
)...在脚本中更改或删除它以满足您的需要。