更改目录中多个文件的部分文件名:

更改目录中多个文件的部分文件名:

我曾经有一个脚本可以执行以下操作。它将重命名当前目录中多个文件的文件名的一部分:

例如:

rename variable1 variable2

rename 456 555

输入:

testa456testa
sama456sama
apple456applea
johna_456_johna
davida_456_davidb

输出:

testa555testa
sama555sama
apple555applea
johna_555_johna
davida_555_davidb

我不再有脚本了,而且我对 Unix 还很陌生。我需要一个可以从命令行使用的脚本。

我现在做的是:

我将文件“ls *(文件名)”列出为临时文件名。然后我搜索%/s/456/555/g。然后我将所有旧文件名移动到新文件名。我可以在命令行“将 $1 重命名为 $2”中执行此操作。因此,在任何给定的目录中,我都会从命令行重命名文件名的中间部分。它可能有数百个文件。希望这是有道理的,谢谢伊万

答案1

仅使用 shell,使用参数扩展:

for f in *456*; do echo mv -i -- "$f" "${f//456/555}"; done

这里我们重新迭代名称中包含的文件456,参数扩展模式${f//456/555}456555.

mv上面将通过显示将运行什么命令来进行空运行,您可以删除echo以让操作发生:

for f in *456*; do mv -i -- "$f" "${f//456/555}"; done

renameprename):

rename -n 's/456/555/g' *456*

这会将文件名中的所有 ( g)456子字符串替换为555( s/456/555/)。

-n将进行试运行,如果您对所做的更改感到满意,请删除-n以进行实际的重命名:

rename 's/456/555/g' *456*

答案2

您似乎忘记将文件传递给rename.

rename 456 555 *456*

答案3

which -a rename

会告诉您 $PATH 上是否有任何重命名工具。

rename 's/456/555/g' *

是执行您想要的操作的首选语法(如手动的)。如果您没有或没有正则表达式的旧版本重命名下载(官方的) prename 这是perldebian 之类的系统使用的脚本。

答案4

(移自问题旨在作为此处的答案)

我找到了我的问题的答案:

#! /bin/csh -f
#----------------------------------------------------------------------
#  Script Name: moveme                          Date:   05/07/96
#  Written by:  John W. Woolsey                 Rev:    10/11/99
#
#  Description:
#    Renames a set of files that contain a particular search string
#    to file names that contain a replacement string.
#
#  Syntax:  moveme <search_string> <replace_string>
#
#  Where:
#     <search_string> is the name of the file name search string.
#     <replace_string> is the name of the file name replace string.
#----------------------------------------------------------------------
#
onintr catch
if ($#argv != 2) goto syntax

ls -d *$1* | sed "s/\(.*\)\$1\(.*\)/mv & \1$2\2/" | sh
exit 0

syntax:
echo "Syntax:  `basename $0` <search_string> <replace_string>"
exit 1

catch:
echo "`basename $0` was interrupted or terminated abnormally."
exit 1

相关内容