重命名目录中的所有文件,同时保留任何文件扩展名

重命名目录中的所有文件,同时保留任何文件扩展名

我有一个包含大约 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;并实际运行它。请记住先将文件备份到某个地方,以防出现问题。

相关内容