我想批量重命名目录中的一些文件,以便从文件名中删除前面的数字和超文本。
Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name: XXX_01_xxxx_20130730235001_00000000.NEW
如何使用linux命令执行此操作?
答案 0 :(得分:39)
这应该成功:
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
答案 1 :(得分:19)
我认为如果你执行以下命令,这个命令会更好:
ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv
这里
ls * - 列出curent文件夹中的文件
sed -e - 执行表达式
p; - 打印旧文件名
s / old-name / new-name / - 生成新文件名
xargs -n2 - 处理mv
的两个参数
mv - 获取两个参数并执行移动操作
推荐:在执行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
答案 2 :(得分:6)
如果第一个数字的长度始终相同:
for F in *new ; do
mv $F ${F:8}
done
${parameter:number}
执行子字符串扩展 - 从第8个字符开始获取字符串。
在扩展中还有许多其他字符串编辑可用于处理其他情况。
答案 3 :(得分:3)
使用renamer(Windows,Mac和Linux友好):
$ renamer --find '/\d+-(.*)/' --replace '$1' *
这将从当前目录中的所有文件的开头删除所有数字和第一个连字符。
答案 4 :(得分:1)
这可能看起来有点复杂,但它非常有效并且在* nix和OSX系统上运行良好。它还以递归方式执行,重命名当前目录中的文件以及任何子目录:
'js' => 'all-{hash}.js',
'css' => 'all-{hash}.css',
以下是对刚刚发生的事情的细分:
第一行说找到(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
)开始,其名称与&#34的模式(.
)相匹配; 7个数字,后跟短划线,后跟0个或更多字符" (-regex
),并将这些文件名及其各自的路径('.*/[0-9]\{7\}[-].*'
)写入名为 temp1 (-print
)的文件中。请注意,> temp1
指令在大多数情况下可能不是必需的,但它不应该伤害任何东西。
-print
然后,将 temp1 的内容复制(find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
)到名为 temp2 的文件。
cp
接下来,使用vi text editor打开文件 temp2 ,并为vi提供两个命令(使用cp temp1 temp2 && \
表示每个新命令):
-c
)的每一行,查找我们在上面搜索的相同模式,但此时使用括号(:g
)对结果进行分组。\([0-9]\{7\}[-]\)\(.*\)
)。\2
)。结果如下:
:x
现在,将 temp1 中的行与 temp2 ( vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \
)的行连接起来,并将每个新组合的行写入名为 temp3 <的文件中/ em>(paste
)。
> temp3
接下来,再次运行 vi ,执行与上述相同的步骤,但这次搜索文件 temp3 中每行(paste temp1 temp2 > temp3 && \
)的开头部分并在其后面添加mv和一个空格(^
)。
mv
然后,执行 temp3 (vi -c ":g/^/s//mv /" -c ":x" temp3 && \
)的内容作为shell脚本(./temp3
)。
sh
最后,删除(sh ./temp3 && \
)我们在整个过程中创建的每个临时文件。
rm
答案 5 :(得分:1)
还有一个方便的GUI工具pyRenamer
https://wiki.ubuntuusers.de/pyRenamer/
答案 6 :(得分:1)
vimv允许您使用Vim的文本编辑功能重命名多个文件。
输入vimv会打开一个Vim窗口,其中列出了所有文件,您可以进行模式匹配,视觉选择等来编辑名称。退出Vim后,文件将被重命名。
README文件中的screencast显示了它如何解决原始海报的问题。
[免责声明:我是该工具的作者]
答案 7 :(得分:0)
我非常喜欢&#34;重命名* .mp3 * .mp4&#34;。
但其他答案都没有给我这个。所以我写了一个haskell程序来做它。
https://hackage.haskell.org/package/batch-rename
有了这个,你可以这样做: batch_rename&#34; DCIM * .jpg&#34; &#34; *。PNG&#34;