重命名/重新编目目录中的文件


0

在某些目录中,我有许多名为的文件

...
DSC_0002
DSC_0005
DSC_0010
...

我想要重命名/重新编号文件

FILE_0001
FILE_0002
...

也许,我需要从0001开始计算


这是 非常 与我的问题类似,但不一定完全相同 重命名多个目录递减序列号? Unix& Linux的 大卫戴的回答在这里 也是 非常 相近 吉尔斯在那里的回答
a CVn

@MichaelKjörling:我想强调一些不同之处 吉尔斯是明智的 回答和 大卫戴年轻的好 一。 :-)风格,坚固和安全。从不同的路径工作意味着额外的预防措施......当吉尔斯不需要时可以避免,而我和大卫没有:)
Hastur

Answers:


2

假设包含这些文件的目录是/ path / to / dir
你需要的脚本将如下所示:

start=1
cd "/path/to/dir"
for file in ./*;do
  mv "${file}" "FILE_$(printf "%04d" $start)"
  start=$((start+1))
done

1
警告: 1.你将移动文件 远程路径 到运行脚本的目录,而不是重命名它们的位置。 2.如果在路径中有一些空格,您没有在脚本中保护该值,它将尝试移动拆分目录名称 FILE_0001 ......例子 /path/to/dir old/* 它会试图移动 mv /path/to/dir FILE_0001mv old FILE_0002
Hastur

1
一首歌说了一遍 哎呀我再次做到了 :)) cd "/path to my/dir"。如果路径中有空格,则无法更改,它将拆分重命名所有当前目录。 8-O当然如果没有空格就没有问题 /path/to/dir
Hastur

欢迎你,这不是关于脚本编写,而是更多关于脚本编写 一旦你写完就扩展它们的用途 。我的意思是今天你为了一个目的写它,它工作正常;明天你将用于另一个目的,期望它也能正常工作。每次你必须考虑可能出现的所有奇怪问题,因为 如果他们存在,他们会来 :-) 而且当然 移动或删除文件时更是如此 或者您 用sudo执行命令 。 :-)
Hastur

这是来自摄像机的文件,名称不包含空格(DSC_ {number} .jpg)有些文件被删除。我不想在编号上留有空白。上面的脚本就足够了。谢谢。
Yuchimenko Igor

@YuchimenkoIgor:我留下评论并更正脚本,因为你所做的问题也会对其他人有用(至少我们希望如此)。我们必须记住,在许多相机类型中,可以确定前缀 文件名 并将它们存储在子目录中:在这两种情况下,空格都是允许的字符。
Hastur

0

尝试

ls | awk '{printf "mv %s FILE_%04d\n",$0,NR ;} ' | bash
  • 确保没有文件有趣的名字。
  • remove | bash部分有预览。
  • 使用 NR+666 从667开始。
  • 使用 %02d 要么 %06d 如图所示生成01或000001。

1
一般警告它 解析ls的输出是不安全的 ......这意味着检查是否没有 有趣的名字 作为中间空间的那些:-)至少你可以解决一些空间问题 健身房 在括号内:而不是 printf "mv %s FILE_%04d\n" 您可以使用 printf "mv \"%s\" \"FILE_%04d\"\n"
Hastur

0

你可以这样做:

#!/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

笔记

  • 当你 mv 可能很危险。它可以覆盖现有文件。它可以移动/重命名目录。因此,在执行脚本之前进行目视检查最好。然后你可以在shell中管道输出:
    例如 ./Myscript.sh,一切都好吗?如果是,那么你可以写 ./Myscript.sh | /bin/bash (或者您可以修改它,消除“echo”或以下行中的注释)。
  • 写作更好 mv -i:它会在覆盖前提示
  • 如果没有 DSC_* 当前目录中的文件 shopt -s nullglob 将避免扩展错误。

  • 一般来说 解析它是不安全的 输出 ls 即使在你的情况下它应该不是一个真正的问题,因为你应该为文件提供相机的标准名称 DSC_nnnn.jpg

  • 通常有一个扩展(也许 .jpg 要么 .tif 要么 .raw )...在脚本中更改或删除它以满足您的需要。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.