Linux 如何在bash脚本的输入中提供由正则表达式表示的文件列表

Linux 如何在bash脚本的输入中提供由正则表达式表示的文件列表,linux,bash,Linux,Bash,我正在创建一个代码,用于从科学论文中自动提取bib记录 在旧版本的脚本中,我输入了存储所有PDF的文件夹的名称,现在我想给出一个正则表达式。例如,在: /AutoBib.sh文件/ 现在: /Autobib.sh Papers/*.pdf 文件夹中有3个PDF文件:SREKK.PDF,FIONA.PDF,DONKEY.PDF,使用我的脚本,我应该能够从所有文件中检索DOI,创建一个文件,其中所有DOI都被列出,但是执行我的脚本,它返回了第一个/强>文件的DOI,并且没有更多。 这是我的代码: f

我正在创建一个代码,用于从科学论文中自动提取
bib
记录

在旧版本的脚本中,我输入了存储所有PDF的文件夹的名称,现在我想给出一个正则表达式。例如,在:

/AutoBib.sh文件/

现在:

/Autobib.sh Papers/*.pdf

文件夹中有3个PDF文件:SREKK.PDF,FIONA.PDF,DONKEY.PDF,使用我的脚本,我应该能够从所有文件中检索DOI,创建一个文件,其中所有DOI都被列出,但是执行我的脚本,它返回了<强>第一个/强>文件的DOI,并且没有更多。 这是我的代码:

for i in $1; do
    doi $i
done
doi是一个从pdf中提取doi并将其放入txt文件的函数。当我运行脚本时,它只返回第一个文件的doi


如何在脚本中输入正则表达式,并能够遍历与该正则表达式匹配的所有文件?

重要的是要理解
Papers/*.pdf
不是正则表达式,它是一种通配符模式,导致
bash
执行文件名扩展,或者

$1
表示脚本的第一个参数,因此您的
for
循环只对该参数进行迭代

使用
$@
表示所有参数:

for i in "$@"; do
    doi "$i"
done

重要的是要了解,
Papers/*.pdf
不是正则表达式,它是一种通配符模式,导致
bash
执行文件名扩展,或者

$1
表示脚本的第一个参数,因此您的
for
循环只对该参数进行迭代

使用
$@
表示所有参数:

for i in "$@"; do
    doi "$i"
done

如果要按模式筛选目录中的文件,可以将此模式作为第二个脚本参数传递,并使用
find
搜索匹配的文件

这是代码。它还可以抵抗包含空格的文件名:

find "$1" -maxdepth 1 -name "$2" -exec doi {} \;

用法示例:
/Autobib.sh Papers/*.pdf

如果要按模式筛选目录中的文件,可以将此模式作为第二个脚本参数传递,并使用
查找
搜索匹配的文件

这是代码。它还可以抵抗包含空格的文件名:

find "$1" -maxdepth 1 -name "$2" -exec doi {} \;

用法示例:
/Autobib.sh Papers/*.pdf

您可以在循环中运行
ls
命令,它将解决您的问题

for x in $(ls $@/*.pdf)
do
echo $x  ## if you want only file name you can change this line to echo `basename $x`
done
我已经创建了与上面提到的相同的场景,请参考快照


您可以在循环中运行
ls
命令,它将解决您的问题

for x in $(ls $@/*.pdf)
do
echo $x  ## if you want only file name you can change this line to echo `basename $x`
done
我已经创建了与上面提到的相同的场景,请参考快照


这有多个问题。您和
*.pdf
不是有效的正则表达式。即使是,您也需要引用它,以防止shell将其扩展为参数列表。谢谢。我编辑了答案以使用
find
而不是
ls
,并使描述更加相关。
read
仍然不可靠,您需要类似
的内容,而IFS=”“read-r filename
则更好的解决方案是
find-行政长官doi{}j是的,看起来很棒!谢谢这有多个问题。您和
*.pdf
不是有效的正则表达式。即使是,您也需要引用它,以防止shell将其扩展为参数列表。谢谢。我编辑了答案以使用
find
而不是
ls
,并使描述更加相关。
read
仍然不可靠,您需要类似
的内容,而IFS=”“read-r filename
则更好的解决方案是
find-行政长官doi{}j是的,看起来很棒!谢谢