我有檔案的arraylist,我正在嘗試將 rm 與 xargs 一起使用來洗掉檔案,例如:
dups=["test.csv","man.csv","teams.csv"]
如何將完整的dups陣列傳遞給find并洗掉這些檔案?
我想在下面進行更改以使其正常作業
find ${dups[@]} -type f -print0 | xargs -0 rm
uj5u.com熱心網友回復:
你的find命令是錯誤的。
# XXX buggy: read below
find foo bar baz -type f -print0
表示查看路徑 foo、bar和baz,并列印其中的任何實際檔案。(如果其中一個路徑是目錄,它會找到該目錄中的所有檔案。如果其中一個路徑是當前目錄中的檔案,它肯定會找到它,但是你需要find什么?)
如果這些是當前目錄中的檔案,只需
rm -- "${dups[@]}"
(還要注意如何正確參考陣列擴展)。
如果要在所有子目錄中查找具有這些名稱的檔案,則需要類似
find . -type f \( -name "test.csv" -o -name "man.csv" -o -name "teams.csv" \) -delete
也許
find . -type f -regextype egrep -regex '.*/(test\.csv|man\.csv|teams\.csv)' -delete
盡管這些-regex功能在某種程度上取決于平臺(嘗試find -E而不是find -regextype egrep在 *BSD/MacOS 上啟用 ERE 正則運算式支持)。
還要注意find內置謂詞如何,-delete因此您根本不需要外部實用程式rm。(盡管如果您想運行不同的實用程式,它仍然find -exec utility {} 比xargs.find -exec
從陣列構建這個命令列并不是一件容易的事。我提出了一個副本,它可以解決類似的問題。但是當然,如??果您是從 Java 構建命令,那么應該很容易弄清楚如何在 Java 端執行此操作,而不是將陣列傳遞給 Bash;然后,您根本不需要 Bash(您可以直接將其傳遞給find,或者至少使用sh而不是,bash因為該命令不需要任何 Bash 功能)。
我不是 Java 人,但從 Python 來看,這看起來像
import subprocess
command = ["find", ".", "-type", "f"]
prefix = "("
for filename in dups:
command.extend([prefix, "-name", filename])
prefix = "-o"
command.extend([")", "-delete"])
subprocess.run(command, check=True, encoding="utf-8")
請注意,當不涉及 shell 時,反斜杠和引號是如何不必要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455244.html
標籤:重击
