2012-09-24 128 views
0

我有一個.txt文件,每行都有一個不同的文件位置,例如,SSH - 從txt文件循環讀取文件並刪除文件

file1.zip 
file2.zip 
file3.zip 

如何打開該文件,循環遍歷每行的每行和rm -f文件名?

此外,如果該文件不存在(將被刪除),將刪除它會拋出一個錯誤,如果有的話,我該如何避免這種情況?

編輯:文件名中可能有空格,所以這也需要照顧。

回答

1

您可以使用for循環與cat通過行迭代:如果文件存在且是一個普通文件(不是目錄)

IFS=$'\n'; \ 
for file in `cat list.txt`; do \ 
    if [ -f $file ]; then \ 
     rm -f "$file"; \ 
    fi; \ 
done 

if [ -f $file ]將檢查。如果檢查失敗,它將跳過它。

頂部的IFS=$'\n'會將分隔符設置爲僅限換行符;這將允許您使用空格處理文件。

+0

是否需要進行if [-f]檢查? rm -f不會立即在不存在的文件或目錄上發生故障(只是診斷消息),並且不會刪除目錄。 – jrajav

+0

@Kiyura OP詢問如何避免拋出錯誤;出於所有目的,條件檢查將避免拋出任何錯誤(如果文件不存在或者它是目錄)。 – newfurniturey

+0

我明白「拋出一個錯誤」,實際上會導致命令失敗。如果您使用rm -f [某些文件列表],它將爲每個目錄和未發送的文件打印一條消息,但它也將繼續並刪除它在列表中的所有內容。您的支票不會添加任何功能,它基本上只是搶佔這些消息,並增加了在每個文件上單獨運行命令的開銷。如果你真的想吃錯誤輸出,那麼明確地做到這一點會更好。 – jrajav

0
xargs -n1 echo < test.txt

替換 '迴響' 使用rm -f或任何其他命令。您還可以使用cat test.txt |

'man xargs'獲取更多信息。

+0

n1應該按行分開嗎?文件名中可能會有空格,並且它似乎被空間所剝奪。 – robjbrain

+0

是的,不幸的是它由空格分開。你可以先通過sed管道把每行用引號括起來,或者用vim在文件本身上執行。 sed選項:'cat test.txt | sed -e「s,[^。],\'&,」-e「s,\ $,\',」| xargs -n1 echo'編輯:沒關係,我只是測試,這也不起作用。 xargs不能很好地處理空格。 – jrajav

+0

作爲一個方面說明,對於整個任務來說,更強大的選項是使用find -print0與xargs -0一起獲取所需的所有文件。不過,我不知道你是如何獲得輸入文件的。 – jrajav