首页 > 解决方案 > 如何读取文件夹中具有相似模式的所有文件并将它们作为逗号分隔的字符串传递给 Python?

问题描述

我有这个 bash 文件:

#!/bin/bash

some_code.py -i 1_xxx.txt,2_xxx.txt,...,10_xxx.txt  -o something.txt

该列表"1_xxx.txt,2_xxx.txt,...,10_xxx.txt"包含文件夹中共有的文件的名称xxx

to 的输入some_code.py必须-i以文件名的形式出现,用逗号分隔,没有空格。

我的问题是:如何将文件名(带xxx)回显到逗号分隔的字符串中并将其传递给我的 Python 代码?

标签: bashecho

解决方案


您可以使用命令替换并设置IFS,. 假设你有

$ ls
1098_xxx.txt  20260_xxx.txt  22286_xxx.txt  32025_xxx.txt  6433_xxx.txt

那么你可以做1

echo "$(IFS=,; f=(*xxx*); printf '%s\n' "${f[*]}")"

导致

1098_xxx.txt,20260_xxx.txt,22286_xxx.txt,32025_xxx.txt,6433_xxx.txt

或者,对于您的用例:

some_code.py -i "$(IFS=,; f=(*xxx*); printf '%s\n' "${f[*]}")" -o something.txt

$(...)是命令替换,${f[*]}是使用第一个字符 fromIFS作为元素分隔符的参数扩展。

这应该保存为包含任何字符的文件名,包括空格和全局字符;如果您有隐藏文件(以 开头.),它们将被忽略,除非您设置了shopt -s dotglobshell 选项。

此外,如果您可能没有匹配的文件*xxx*,您可以设置shopt -s nullglob以防止创建一个字面上称为*xxx*.


1 echo "$(cmd)"通常是由 just 代替的反模式cmd;我在这里使用它echo作为其他命令的占位符。使用命令替换还具有IFS仅在此处更改而不在父 shell 中更改的好处。


推荐阅读