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代码>是的,看起来很棒!谢谢