Bash 脚本读取目录中的所有文件,将它们的文件名添加到字符串中以便在命令行参数中使用

Bash 脚本读取目录中的所有文件,将它们的文件名添加到字符串中以便在命令行参数中使用

我有一个 bash 脚本,它执行以下操作:

java -jar executablefile.jar --width 100 --speed 50 --ouput outfile.mp4 --input file1.dat file2.dat file3.dat (etc)

我可以像这样读取目录中的所有文件:

dir=~/location/to/files
for f in "$dir"/*; do
   echo "$f"
done

上面的测试显示了所有文件。这样我就可以一次将一个文件放入 $f 中。但是我需要(可能在那个循环中)将每个文件名字符串(包括我相信的路径)连接到一个我可以使用的变量中,如下所示:

java -jar executablefile.jar --width 100 --speed 50 --ouput outfile.mp4 --input $listOfFileNamesWithSpaceBetweenEachFile 我这辈子都找不到这样的东西了。有人有什么建议吗?

谢谢。

更新 经过沟通,事实证明我有点错了。它需要是这样的:

-- input /path/to/filename1.gpx --input /path/to/filename2.gpx --input /path/to/filename3.gpx etc

所以我能够通过以下方式获取字符串:

VAR=""
dir=~/location/to/files
for f in "$dir"/*; do
    echo ${f}
    VAR+="--input ${f} "
done
`

感谢大家的帮助!

答案1

如果您在 shell 命令行上运行此命令:

somecommand --input file1.dat file2.dat file3.dat 

然后somecommand将得到 4 个参数--input和三个文件名。你可以做同样的事情

somecommand --input file*.dat

globfile*.dat将扩展为文件名列表,每个文件名都有一个单独的参数somecommand.

所以,

java ... --input ~/location/to/files/*

可能是也可能不是您需要做的全部。


现在,您可以有一个像这样的变量var="foo.txt bar.txt",并将其不加引号地使用,以将其用作蹩脚列表,但是当某些文件名包含空格(或更糟)时,这就会遇到麻烦。

相反,使用数组:

files=(foo.txt bar.txt)
somecommand --input "${files[@]}"

或者

files=(foo*.txt) # expands each filename to a distinct array element.
somecommand --input "${files[@]}"

我们如何运行存储在变量中的命令?有关其他详细信息,包括。增量构建阵列。


在编辑中,您说该命令需要--input file1 --input file2 ...改为,就像带参数的命令行选项如何工作一样。

在这种情况下,您需要在数组中构建参数,如下所示:

args=()
dir=~/location/to/files
for f in "$dir"/*; do
   args+=(--input "$f")
done

并再次运行命令

somecommand ... "${args[@]}"

相关内容