我有一个包含大约 1200 个文件的文件夹,我需要重命名。大多数文件扩展名为 .jpg、.gif 和 .png。
这里有些例子:
Awesome\ FB\ \ (462).jpg
Bonus\ FB\ Cover\ Pics\ (80).jpg
Awesome\ FB\ \ (463).jpg
Bonus\ FB\ Cover\ Pics\ (81).jpg
Awesome\ FB\ \ (464).jpg
Bonus\ FB\ Cover\ Pics\ (82).jpg
Awesome\ FB\ \ (465).jpg
Bonus\ FB\ Cover\ Pics\ (83).jpg
我试过:
rename 's/\.{???} $/-img4sm.{???}/' ./*.{???}
我也尝试过这个,但只是放置了 .jpg 或 .gif 而不是 {???},并将 {} 替换为 []。
我也尝试过:
find . -type f -iname '*.???' -exec rename 's/\.{???} $/-img4sm.{???}/' ./*.{} +
我已经成功地在 CloudLinux (CentOS) 中使用此命令,没有出现错误消息,但文件名没有更改。
请帮我。谢谢你!
答案1
不幸的是,rename
在不同版本的 Unix 上,它的含义不同。特别是在 Fedora 上,因此我想 CentOS 上rename
只会接受简单的字符串,而不是像您正在使用的那样的 perl 表达式(这可以在 debian 上工作)。
但是,您似乎只想添加“-img4sm”。在 .jpg、.png 和 .gif 后缀前面,因此使用您的重命名版本尝试:
rename -- .jpg -img4sm.jpg *.jpg
rename -- .png -img4sm.png *.png
rename -- .gif -img4sm.gif *.gif
始终将您的目录复制到某处作为备份,以防这些命令不符合您的预期。
如果您愿意,可以安装更复杂的perl
脚本rename
来自 cpan如果您已经知道,可以使用 cpan 命令,或者只需将该页面上的链接下载到下载焦油。解压 tar 并使用以下命令“构建”脚本
tar xf rename-1.9.tar.gz
cd rename-1.9
perl Makefile.PL
make
mv bin/rename ~/bin/prename
其中最后一个mv
是您的 PATH 中的某个私有 bin 目录。使用该名称prename
可以避免与已有的重命名命令混淆。然后您可以使用它来执行您的操作,例如:
prename -n 's/\.(jpg|png|gif)$/-mg4sm.$1/' -- *.{jpg,gif,png}
这里的-n
意思是只展示会发生什么,而不做。
答案2
和zsh
:
autoload zmv # best in ~/.zshrc
zmv -n '(*).(png|jpg|gif)' '$1-mg4sm.$2'
删除-n
实际执行的操作。
否则,POSIXly,你总是可以这样做:
for file in *.png *.jpg *.gif; do
echo mv -i -- "$file" "${file%.*}-mg4sm.${file##*.}"
done
(删除echo
以实际执行)。
答案3
这是一个基于 php 的解决方案这个答案。创建一个文件,例如myrename.php
包含以下内容:
<?php
$test = 1;
if(!chdir('/tmp/mydir')) echo "failed chdir\n";
else if ($handle = opendir('.')) {
while (false !== ($fileName = readdir($handle))) {
$newName = preg_replace("/\.(jpg|gif|png)$/i","-img4sm.\\1",$fileName);
if($newName!=$fileName){
if($test){
echo "$fileName -> $newName\n";
}else{
if(!rename($fileName, $newName))echo "failed $fileName -> $newName\n";
}
}
}
closedir($handle);
}
?>
替换/tmp/mydir
为您的目录路径。运行脚本
php myrename.php
它会打印出每个匹配文件的旧文件名和新文件名。如果没问题,请更改$test = 1;
为$test = 0;
并实际运行它。请记住先将文件备份到某个地方,以防出现问题。