我想批量重新命名目录中的一些文件,以便从文件名中去掉前面的数字和连字符。
Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name: XXX_01_xxxx_20130730235001_00000000.NEW
我该如何使用Linux命令完成这个任务?
我想批量重新命名目录中的一些文件,以便从文件名中去掉前面的数字和连字符。
Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name: XXX_01_xxxx_20130730235001_00000000.NEW
我该如何使用Linux命令完成这个任务?
这应该使它变得更好:
rename 's/^[0-9]*-//;' *
它从文件名的开头获取连续出现的数字[0-9]
,然后加上连字符-
并将其从文件名中删除。
如果你的机器上没有rename
命令,你可以使用循环和mv
来替代:
mv "$f" "${f#[0-9]*-}"
$ ls
23-aa hello aaa23-aa
$ rename 's/^[0-9]*-//;' *
$ ls
aa hello aaa23-aa
或者:$ ls
23-a aa23-a hello
$ for f in *;
> do
> mv "$f" "${f#[0-9]*-}"
> done
$ ls
a aa23-a hello
rename
版本上无法工作(util-linux-ng 2.17.2)。你使用的是哪个版本? - Yossarianmv
命令。这对你有用吗? - fedorquimv
命令对我有效。看来 rename
必须有两个版本 - 我的需要三个参数(rename from to file
)。 - Yossarian我认为如果你执行下面的命令,这个命令会更好:
ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv
这里
ls * - 列出当前文件夹中的所有文件建议:在执行mv命令之前,使用echo验证您要达到的目标是否正确。
ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 echo
以下示例将
SCCF099_FG.gz5329223404623884757.tmp 重命名为
SCCF099_FG.gz
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 echo
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 mv
sed
时,如果有5个文件存在,表达式字符串会打印每一行,然后立即在其下方打印其查找和替换后的副本;然后,xargs
将这个包含10个项目的列表现在2个一组进行解析,并将它们作为参数传递给mv
。对吗? - Luke Davisfind . -print0 | sed -z -e 'p;s/old-name/new-name/' | xargs -n2 -0 mv
。 - Peter Noweefor F in *new ; do
mv $F ${F:8}
done
${parameter:number}
进行的是子字符串扩展 - 从第8个字符开始取字符串。
在扩展中还有许多其他可用的字符串编辑方式来处理其他情况。
使用renamer(适用于Windows、Mac和Linux):
$ renamer --find '/\d+-(.*)/' --replace '$1' *
这将从当前目录中所有文件的开头删除所有数字和第一个连字符。
find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
cp temp1 temp2 && \
vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \
paste temp1 temp2 > temp3 && \
vi -c ":g/^/s//mv /" -c ":x" temp3 && \
sh ./temp3 && \
rm temp1 temp2 temp3
以下是所发生情况的详细说明:
第一行指示找到(find
)所有文件,以当前目录为起点(.
),它们的名称匹配模式(-regex
)为“7个数字,后跟一个破折号,后跟0个或多个字符”('.*/[0-9]\{7\}[-].*'
),并将这些文件名和它们各自的路径写入名为temp1的文件中(> temp1
)。请注意,-print
指令在大多数情况下可能不是必需的,但它不会有任何问题。
find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
接下来,将temp1的内容复制(cp
)到一个名为temp2的文件中。
cp temp1 temp2 && \
接下来,使用vi文本编辑器打开temp2文件,并给vi两个命令(使用-c
表示每个新命令):
:g
),查找与上面相同的模式,但这次使用括号将结果分组(\([0-9]\{7\}[-]\)\(.*\)
)。\2
)。:x
)。其结果如下:
vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \
现在,将temp1中的行与temp2中的行拼接在一起(使用paste
),并将每个新组合的行写入名为temp3的文件中(使用> temp3
)。
paste temp1 temp2 > temp3 && \
^
),并在其后添加 mv 和一个空格(mv
)。vi -c ":g/^/s//mv /" -c ":x" temp3 && \
然后,执行temp3的内容(./temp3
)作为shell脚本(sh
)。
sh ./temp3 && \
rm
)我们在整个过程中创建的每个临时文件。rm temp1 temp2 temp3
rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'
-fo
是文件模式
-dp
是目录深度(-1
表示无限深度)。
-rs
是替换字符串。 \d+-
正则表达式将被替换为空字符串。
-ss
是搜索字符串,它搜索带有 ^\d+-
正则表达式的文件。(虽然可以省略,但屏幕上会打印一些无害的错误消息)。
我真的很喜欢像“rename *.mp3 *.mp4”这样的东西。
但是其他答案都没有给我这个。所以我写了一个Haskell程序来实现它。
https://hackage.haskell.org/package/batch-rename
使用这个命令,你可以做到: batch_rename "DCIM*.jpg" "*.png"