如何在使用bash更改名称和扩展名的同时将多个文件移动到目录中?

时间:2017-08-10 21:26:34

标签: linux bash

/opt/dir/ABC/中有多个文件名为allfile_123-abc allfile_123-def allfile_123-ghi allfile_123-xxx

我需要将文件命名为new_name-abc.pgp new_name-def.pgp new_name-ghi.pgp new_name-xxx.pgp,然后移至/usr/tst/output

for file in /opt/dir/ABC/allfile_123* ; 
do mv $file /usr/tst/output/"$file.pgp"; 
rename allfile_123 new_name /usr/tst/output/*.pgp ; done

我知道上面的内容不起作用,因为$file = /opt/dir/ABC/allfile_123*。是否可以使这个工作,或者它是一个不同的命令而不是'for loop'?

这适用于Autosys应用程序,其中jil包含一个命令,可以传递给运行bash的linux服务器的命令行。

我只能找到问题的每个部分的版本,但不能完全找到,我希望将它保留在这个jil的命令行中。除非绝对需要脚本。

1 个答案:

答案 0 :(得分:4)

不需要循环,只需renamemv即可执行此操作:

rename -v 's/$/.pgp/' /opt/dir/ABC/allfile_123*
rename -v s/allfile_123/new_name/ /opt/dir/ABC/allfile_123*
mv /opt/dir/ABC/new_name* /usr/tst/output/

但我不确定你使用的rename是否与我的相同。 然而, 因为您想要执行的替换非常简单, 在纯粹的Bash中很容易做到:

for file in /opt/dir/ABC/allfile_123*; do
    newname=new_name${file##*allfile_123}.gpg
    mv "$file" /usr/tst/output/"$newname"
done

如果你想把它写在一行:

for file in /opt/dir/ABC/allfile_123*; do newname=new_name${file##*allfile_123}.gpg; mv "$file" /usr/tst/output/"$newname"; done