2017-09-28 13 views
2

因此,如標題所述,我希望遞歸刪除與用戶給出的命名模式相匹配的所有文件,但僅當文件爲空時纔會刪除。這裏是我的嘗試:Linux bash腳本:根據用戶輸入的文件格式,如果爲空,可以重新刪除文件

#!/bin/bash 

_files="$1" 
[ $# -eq 0 ] && { echo "Usage: $0 filename"; exit 1; } 
[ ! -f "$_files" ] && { echo "Error: $0 no files were found which match given naming structure."; exit 2; } 
for f in $(find -name $_files) 
do 

    if [ -s "$f" ] 
    then 
     echo "$f has some data." 
      # do something as file has data 
    else 
     echo "$f is empty. Deleting file." 
     rm $f 
    fi 
done 

輸出示例:

./remove_blank.sh *.o* 
./Disp_variations_higher_0.o1906168 has some data. 
./remove_blank.sh *.e* 
./Disp_variations_higher_15.e1906183 is empty. Deleting file. 

正如你看到的,代碼工作,但只有一次一個文件。應該是一個相對簡單的修復工作,但我對bash腳本非常陌生,似乎無法解決它。不好意思,不好意思。我做了一些研究來找到答案,但沒有找到我所需要的。預先感謝您的幫助。

編輯 我發現了兩個不同的問題解決方案。作爲@David Z的建議,可以通過刪除腳本的錯誤檢查部分以及在find函數中將$ _files變量加上引號來解決這個問題。然後代碼如下所示:

#!/bin/bash 
_files=$1 
[ $# -eq 0 ] && { echo "Usage: $0 filename"; exit 1; } 
for f in $(find -name "$_files") 

if [ -s $f ] 
    then 
     echo "$f has some data." 
     # do something as file has data 
    else 
     echo "$f is empty. Deleting file." 
     rm $f 
    fi 

或者,你也可以簡單地以 「$ @」,它允許誤差改變for循環對於f檢查是否保存在腳本中。我不確定哪種方法更好,但如果我找到了,會再次更新。

+1

您需要引用命令行參數和'$ _files'處處以防止擴張。 – Mat

+1

難道你不能在一個'find'命令中做這個嗎? – marekful

+0

只要_files_和_recursive_關聯在bash問題中,顯而易見的答案應該是['find'](https://en.wikipedia.org/wiki/Find_(Unix))。 – mouviciel

回答

2

它看起來像你調用腳本的方式,shell在運行你的腳本之前擴展了模式。例如,在

./remove_blank.sh *.o* 

殼轉換*.o*以匹配模式的,和文件名的列表,則其實際運行是一樣的東西

./remove_blank.sh Disp_variations_higher_0.o1906168 other_file.o12345 ... 

但你只檢查的第一個參數在腳本,所以這是最終被刪除的那個。

解決方案:在運行腳本時引用模式。

./remove_blank.sh '*.o*' 

你也將需要刪除的測試[ ! -f "$_files" ] ...因爲$_files被設置爲模式(如*.o*),而不是一個文件名。事實上,您可能想要重命名變量以使其清晰。最後,你需要引用變量在find命令,

... $(find -name "$_files") ... 

,這樣的格局使得它一路走過來find沒有被shell轉換成文件名。

該腳本還存在其他一些問題,但您可能需要詢問關於Code Review的問題。我在這裏確定的只是實現它的最低要求。


順便說一句,你可以完成使用find本身這個整體任務,這將至少給清潔代碼:

find -name "$_files" -type f -empty -delete 
+0

我試過了你的建議,但它會拋出錯誤消息:Error:./remove_blank.sh沒有找到與給定命名結構匹配的文件。 從輸入:./remove_blank.sh'* .o *' 是的,我確定在我運行腳本的目錄中有* .o *文件。 – cwm5412

+0

啊,對,我會更新以澄清這一點。 –

+0

那就是大衛,謝謝你。不過,我確實找到了一個替代品,可以讓我保留錯誤檢查。根據本文的建議,我簡單地在$(find -name「$ _files」)行中用'for f'代替「$ @」中的f代碼:https://stackoverflow.com/questions/19458104/如何做我通過一個通配符參數到一個bash文件 有兩種方法的任何pro/con權衡? – cwm5412

相關問題