Bash
將目錄中的所有文件作為 cli 參數附加
我需要執行一個看起來像這樣的命令
mycli --file test.zip --file another_test.zip
如何使用目錄中的所有 zip 文件動態執行它?我確定我可以從 find 命令通過管道傳輸文件,但我不知道如何實際將它們作為參數附加到另一個命令,而且我的 bash-fu 不是很好
使用數組:
unset -v args declare -a args for file in *.zip do args+=( --file "$file" ) done mycli "${args[@]}"
或者,POSIXly:
set -- for file in *.zip do set -- "$@" --file "$file" done mycli "$@"
或者,假設 GNU 工具:
find . -maxdepth 1 -name '*.zip' -printf '--file\0%f\0' | xargs -0 -- mycli
基於數組的方法和基於 - 的方法之間的相關區別
xargs
:雖然前者可能會因“參數列表太長”錯誤而失敗(假設mycli
不是內置命令),但後者不會,mycli
而是會執行不止一次. 但是請注意,在最後一種情況下,除了最後一次呼叫的參數列表之外的所有參數列表都可能以--file
(並且以下一個以文件名開頭)結尾。根據您的案例,您可以使用xargs
’ 選項(例如-n
和-x
)的組合來防止這種情況。另外,請注意,
find
它將在其輸出中包含隱藏文件,而基於數組的替代方案不會,除非dotglob
在 Bash 中設置了 shell 選項,或者在 POSIX shell 中,同時使用了 the*.zip
和.*.zip
globbing 表達式。有關這方面的詳細資訊和警告: 如何將所有文件(包括隱藏文件)從一個目錄移動到另一個目錄?.