2017-08-10 69 views
4

/opt/dir/ABC/中有多個文件allfile_123-abc allfile_123-def allfile_123-ghi allfile_123-xxx如何在使用bash更改名稱和擴展名時將多個文件移動到目錄?

我需要的文件被命名爲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循環'?

這是用於Autosys應用程序,其中jil包含一個命令傳遞給運行bash的linux服務器的命令行。

我只能找到我的問題的每個部分的版本,但不是完全,我希望保持它在這個jil的命令行。除非腳本是絕對必要的。

+1

你說'/ opt/dir/ABC/allfile_123 *'不起作用?它將工作,如果glob模式是準確的。當你引用它時(例如'mv「$ file」「/usr/tst/output/$file.pgp」'),你應該在''$ file「'周圍使用雙引號,但這不是你的直接問題。你傳遞給劇本的是什麼? –

+0

我沒有把任何東西傳遞給腳本,這一切都在命令行上。我收到的錯誤是'mv:無法將'/ opt/dir/ABC/allfile_123-abc'移動到'/usr/tst/output//opt/dir/ABC/allfile_123-abc.pgp':沒有這樣的文件或目錄.' – Emile

+0

'mv「$ file」/ usr/tst/output/new_name「$ {file#allfile_123}」。pgp'應該可以工作 –

回答

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您使用的是和我一樣。 然而, 因爲要進行更換是相當簡單的, 很容易在純擊做:

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 
+0

這看起來像基於Perl的'rename'(有時稱爲'prename');問題中的代碼看起來像是在使用其他版本 - 我不確定它來自哪裏(也許是GNU fileutils)。我不喜歡這種替代品的無用功能 - 基本上,我只使用Perl版本。 –

+0

我用分號分隔同一行的每一行,並收到以下錯誤「mv can not stat/opt/dir/ABC/new_name *」:沒有這樣的文件或目錄 – Emile

+0

@Emile錯誤信息告訴你沒有帶有該前綴的文件。重命名不起作用或者沒有重新命名。一步一步地運行命令,並驗證每個步驟按預期工作。一旦你有了一個可行的解決方案,使用'&&'而不是';'將命令鏈接在一起。這樣,命令鏈將在命令失敗時停止,而不執行其他命令。 – janos

相關問題