我有一個.txt文件,每行都有一個不同的文件位置,例如,SSH - 從txt文件循環讀取文件並刪除文件
file1.zip
file2.zip
file3.zip
如何打開該文件,循環遍歷每行的每行和rm -f文件名?
此外,如果該文件不存在(將被刪除),將刪除它會拋出一個錯誤,如果有的話,我該如何避免這種情況?
編輯:文件名中可能有空格,所以這也需要照顧。
我有一個.txt文件,每行都有一個不同的文件位置,例如,SSH - 從txt文件循環讀取文件並刪除文件
file1.zip
file2.zip
file3.zip
如何打開該文件,循環遍歷每行的每行和rm -f文件名?
此外,如果該文件不存在(將被刪除),將刪除它會拋出一個錯誤,如果有的話,我該如何避免這種情況?
編輯:文件名中可能有空格,所以這也需要照顧。
您可以使用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'
會將分隔符設置爲僅限換行符;這將允許您使用空格處理文件。
xargs -n1 echo < test.txt
替換 '迴響' 使用rm -f或任何其他命令。您還可以使用cat test.txt |
'man xargs'獲取更多信息。
n1應該按行分開嗎?文件名中可能會有空格,並且它似乎被空間所剝奪。 – robjbrain
是的,不幸的是它由空格分開。你可以先通過sed管道把每行用引號括起來,或者用vim在文件本身上執行。 sed選項:'cat test.txt | sed -e「s,[^。],\'&,」-e「s,\ $,\',」| xargs -n1 echo'編輯:沒關係,我只是測試,這也不起作用。 xargs不能很好地處理空格。 – jrajav
作爲一個方面說明,對於整個任務來說,更強大的選項是使用find -print0與xargs -0一起獲取所需的所有文件。不過,我不知道你是如何獲得輸入文件的。 – jrajav
是否需要進行if [-f]檢查? rm -f不會立即在不存在的文件或目錄上發生故障(只是診斷消息),並且不會刪除目錄。 – jrajav
@Kiyura OP詢問如何避免拋出錯誤;出於所有目的,條件檢查將避免拋出任何錯誤(如果文件不存在或者它是目錄)。 – newfurniturey
我明白「拋出一個錯誤」,實際上會導致命令失敗。如果您使用rm -f [某些文件列表],它將爲每個目錄和未發送的文件打印一條消息,但它也將繼續並刪除它在列表中的所有內容。您的支票不會添加任何功能,它基本上只是搶佔這些消息,並增加了在每個文件上單獨運行命令的開銷。如果你真的想吃錯誤輸出,那麼明確地做到這一點會更好。 – jrajav