gpt4 book ai didi

Bash 和带空格的文件名

转载 作者:行者123 更新时间:2023-11-29 08:43:28 25 4
gpt4 key购买 nike

下面是一个简单的 Bash 命令行:

grep -li 'regex' "filename with spaces" "filename"

没问题。以下工作也很好:

grep -li 'regex' $(<listOfFiles.txt)

其中 listOfFiles.txt 包含要 grep 的文件名列表,一个每行文件名。

listOfFiles.txt 包含带有嵌入式空间。在我尝试过的所有情况下(见下文),Bash 将空格处的文件名,例如 listOfFiles.txt 中的一行包含类似 ./this is a file.xml 的名称最终尝试运行grep 在每个片段上(./thisisafile.xml)。

我以为我是一个比较高级的 Bash 用户,但我找不到简单的魔法咒语让这个工作。这是我的东西尝试过。

grep -li 'regex' `cat listOfFiles.txt`

如上所述失败(我真的没想到这会起作用),所以我以为我会在每个文件名周围加上引号:

grep -li 'regex' `sed -e 's/.*/"&"/' listOfFiles.txt`

Bash 将引号解释为文件名的一部分并给出“No such每个文件的文件或目录”(并且仍然将文件名拆分为空白)

for i in $(<listOfFiles.txt); do grep -li 'regex' "$i"; done

这与最初的尝试一样失败(也就是说,它的行为就像引号被忽略)并且非常慢,因为它必须启动一个'grep'处理每个文件,而不是在一次调用中处理所有文件。

下面的工作,但需要一些小心的双重转义,如果正则表达式包含 shell 元字符:

eval grep -li 'regex' `sed -e 's/.*/"&"/' listOfFiles.txt`

这是构建命令行的唯一方法吗?正确处理带空格的文件名?

最佳答案

试试这个:

(IFS=$'\n'; grep -li 'regex' $(<listOfFiles.txt))

IFS是内部场分隔符。将其设置为 $'\n'告诉 Bash 使用换行符来分隔文件名。它的默认值为 $' \t\n'并且可以使用 cat -etv <<<"$IFS" 打印.

将脚本括在括号中会启动一个子 shell,因此只有括号内的命令才会受到自定义 IFS 的影响。值(value)。

关于Bash 和带空格的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1574898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com