2015-09-09 37 views
0

bash中存在一些特殊問題。我想編寫一個腳本,該腳本採用文件名的前綴,並刪除以該前綴開頭並以某些給定後綴結尾的所有文件。要做到這一點,我有下面的代碼行:rm -f不會處理bash腳本中的所有參數

#!/bin/bash 

if [ $# -lt 1 ]; then 
     echo "Please provide an argument"; 
     exit 1 
fi 

# Ending dot already included in $1 
rm -f $1"aux" $1"bbl" $1"blg" $1"synctex.gz" $1"log" 

# But even if you call it wrong... 
rm -f $1".aux" $1".bbl" $1".blg" $1".synctex.gz" $1 ".log" 

exit 0 

不幸的是,當我把我的腳本(這被稱爲cleanlatex),按預期:

cmd$ cleanlatex lpa_aaai. 

只有.aux文件被刪除。顯然,rm -f不會將其應用程序擴展到所有參數,如果我明確運行rm -f lpa_aaai.aux lpa_aaai.bbl ...,則會發生這種情況。我在這裏做錯了什麼?

編輯:要回答@伊坦的問題,這是我看到的時候我添加這些命令:

+ '[' 1 -lt 1 ']' 
+ rm -v lpa_aaai.aux lpa_aaai.bbl lpa_aaai.blg lpa_aaai.synctex.gz lpa_aaai.log 
removed ‘lpa_aaai.aux’ 
removed ‘lpa_aaai.bbl’ 
removed ‘lpa_aaai.blg’ 
removed ‘lpa_aaai.synctex.gz’ 
removed ‘lpa_aaai.log’ 
+ rm -v lpa_aaai..aux lpa_aaai..bbl lpa_aaai..blg lpa_aaai..synctex.gz lpa_aaai. .log 
rm: cannot remove ‘lpa_aaai..aux’: No such file or directory 
rm: cannot remove ‘lpa_aaai..bbl’: No such file or directory 
rm: cannot remove ‘lpa_aaai..blg’: No such file or directory 
rm: cannot remove ‘lpa_aaai..synctex.gz’: No such file or directory 
rm: cannot remove ‘lpa_aaai.’: No such file or directory 
rm: cannot remove ‘.log’: No such file or directory 

第二組,由cannot remove郵件,不關心我,我只有這些刪除無論如何作爲失敗保險。這正是我所需要的。謝謝。

+0

試試這個:'rm -f $ 1 {。,} {aux,bbl,blg,log,synctex.gz}'。 –

+0

它在我的機器上沒有任何問題,在輸入中使用或不使用'.'。 –

+0

如果您正在從當前目錄運行您的腳本,請在'.sh'文件之前使用'。/',或使用'/ tmp/foo/myscript.sh'作爲'絕對路徑'。 –

回答

5

目前尚不清楚你的問題實際是什麼;但是,您可以將您的腳本降低到bash兩行:

: ${1?Please provide an argument} 
rm -f "$1".{aux,bbl,log,synctex.gz,log} 

第一行具有相同的效果您if陳述,使用標準的POSIX參數擴展。

第二行正確引用$1並使用大括號擴展來生成具有所需後綴列表的文件名序列。它簡化了用戶輸入文件的基本名稱的簡單假設:沒有結尾的時間段,當foo足夠時,誰會輸入foo.?你已經假定沒有命名的文件(例如)foo.auxfoo..aux,所以你不妨做一個假設,以減少工作量。

我刪除exit 0因爲無論rm成功,你的腳本將與狀態0退出,無論如何,或rm失敗,在這種情況下,你不應該與0狀態來退出,但無論狀態rm退出時。

+0

偉大的工作蒸餾。 :)不要忘記'{。,}'同時處理OP的'rm'。 – ghoti

+0

這也適用,比@ Etan的解決方案更優雅。我希望我能接受兩個答案,但我不能。因此,爲簡單起見,我將接受這一點謝謝。 – Jason

+0

@ghoti爲了清楚起見,我有意省略了第二個「rm」。 – chepner