Bash

將目錄中的所有文件作為 cli 參數附加

  • February 23, 2021

我需要執行一個看起來像這樣的命令

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.*.zipglobbing 表達式。有關這方面的詳細資訊和警告: 如何將所有文件(包括隱藏文件)從一個目錄移動到另一個目錄?.

引用自:https://unix.stackexchange.com/questions/630483