我需要在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
?
编辑:为了澄清,我希望制作数百个不同的重命名命令,需要进行的不同更改会列在文本文件中。
道歉,如果已经回答,我有一个很好的打猎,但找不到类似的案例。
答案 0 :(得分: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
(查找folder
)子目录中的所有txt文件,或
find folder -type f -iname '*.txt' -exec rename 's/^(abcd_)old_name(\d+_1234\.txt)$/$1new_name$2/' {} \+
使用GNU find
进行同样的操作答案 1 :(得分: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 ,并使用$old_name
重命名替换$new_name
的文件,保持文件名的其余部分不变
答案 2 :(得分:0)
我正准备为自己编写一个php函数,但我找到了一个更快的方法:
ls
并复制&amp;将目录内容从终端窗口粘贴到excel中。也许您可能需要在online line break removal or addition tool上使用。假设您的文件名在A列中。在Excel中,请在另一列中使用以下公式:
="mv "&A1&" prefix"&A1&"suffix"
或
="mv "&A1&" "&substitute(A1,"jpeg","jpg")&"suffix"
或
="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只是运行文件中的每一行,就像你输入它一样。
你完成了!这个方法给出了错误的详细输出,这很方便。