我曾经有一个脚本可以执行以下操作。它将重命名当前目录中多个文件的文件名的一部分:
例如:
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}
将456
用555
.
mv
上面将通过显示将运行什么命令来进行空运行,您可以删除echo
以让操作发生:
for f in *456*; do mv -i -- "$f" "${f//456/555}"; done
和rename
(prename
):
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
答案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