如何用文件名重复选项?

如何用文件名重复选项?

我有一个命令,其形式为

#!/bin/bash

command -f hello.txt -f world.txt -f bonjour.txt

hello.txtworld.txtbonjour.txt是目录中的文件/directory

由于实际上有 50 或 60 个这样的文件(并且它们会发生变化),因此我想-f在 之后生成“ ”部分command

-f如果命令是(仅一个)的话,这将很容易

command -f hello.txt world.txt bonjour.txt

因为我会选择

command -f $(ls /directory)

是否有一种简单的方法来加入-f和元素ls /directory

我正在寻找 Python 的等价物

"-f " + " -f ".join(['hello.txt', 'world.txt', 'bonjour.txt'])

其中['hello.txt', 'world.txt', 'bonjour.txt']是生成的列表。

答案1

使用循环构建变量for

因为您使用的是 Bash,所以应该使用数组变量,因为命令行参数实际上是一个数组,而不是单个扁平字符串。这将避免各种与引用相关的问题:

args=()
for file in /directory/*; do
    args+=(-f "${file##*/}")
done
mycommand "${args[@]}"

出于同样的原因,$(ls)当可以使用内置通配符时,请避免使用*

如果您正在为基线 POSIX shell 编写而不是专门为 Bash 编写,则需要使用字符串变量,但仍可以使用它*来获取文件名,以及for将它们连接在一起:

args=""
for file in ...; do
    args="$args ..."
done
mycommand $args

有更紧凑的方式来编写这个,但它们既不容易阅读,也不会显著加快速度。

答案2

我将使用 printf 进行自动扩展,如下所示:

command $( printf -- '-f %q ' *.txt )

这将导致如下命令,具体取决于目录中的 .txt 文件:

command -f hello.txt -f world.txt -f bonjour.txt

相关内容