基于输入文件重命名Linux文件

5

我需要在Linux命令行中重命名数百个文件,以更改每个文件的唯一标识符。例如,我有一个包含以下内容的文件:

old_name1 new_name1
old_name2 new_name2

需要将名称从新ID更改为旧ID。文件名包含ID,但也包含额外字符。因此,我的计划是最终达到以下目标:

abcd_old_name1_1234.txt ==> abcd_new_name1_1234.txt
abcd_old_name2_1234.txt ==> abcd_new_name2_1234.txt

使用rename显然非常有帮助,但我正在努力弄清楚如何遍历所需名称更改的文件,并将其作为输入传递到rename中?
编辑:澄清一下,我想要创建数百个不同的重命名命令,需要进行的不同更改列在文本文件中。
如果已经回答了这个问题,请原谅,我已经搜索过了,但找不到类似的情况。

此问题似乎与 Unix & Linux (unix.stackexchange.com) 无关,因此被视为不相关话题。 - slm
3个回答

4
rename 's/^(abcd_)old_name(\d+_1234\.txt)$/$1new_name$2/' *.txt

根据您是否安装了该软件包,应该可以工作。还可以查看qmv(rename-utils)。

如果您想要更多选项,请使用例如:

shopt -s globstart
rename 's/^(abcd_)old_name(\d+_1234\.txt)$/$1new_name$2/' folder/**/*.txt

(在文件夹的子目录中查找所有txt文件),或
find folder -type f -iname '*.txt' -exec rename 's/^(abcd_)old_name(\d+_1234\.txt)$/$1new_name$2/' {} \+

使用GNU find执行相同的操作

1
while read -r old_name new_name; do
    rename "s/$old_name/$new_name/" *$old_name*.txt
done < file_with_names

以这种方式,您从名为file_with_names的文件中读取ID,并将文件重命名为用$new_name替换$old_name,同时保留文件名的其余部分。

太棒了,正是我所寻找的。以前不知道有读取单词的分割,这在一般情况下非常有用。 - Reuben John Pengelly

0

我本来打算写一个PHP函数来为自己完成这个任务,但是我找到了一种更快的方法:

在终端窗口中使用ls命令并将目录内容复制粘贴到Excel中。也许你需要使用在线换行符添加或删除工具。假设你的文件名在A列中,在Excel中,在另一列中使用以下公式:

="mv "&A1&" 前缀"&A1&"后缀"

或者

="mv "&A1&" "&substitute(A1,"jpeg","jpg")&"后缀"

或者

="mv olddirectory/"&A1&" newdirectory/"&A1

回到Linux系统,在终端中创建一个新文件:nano rename.txt,然后将Excel中的值粘贴进去。它们应该看起来像这样:

mv oldname1.jpg newname1.jpg
mv oldname1.jpg newname2.jpg

然后退出nano并运行以下命令:bash rename.txt。Bash会像您手动输入一样运行文件中的每一行。

完成了!此方法在错误时提供详细输出,非常方便。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接