相关疑难解决方法(0)

带空格的Bash和文件名

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

grep -li 'regex' "filename with spaces" "filename"
Run Code Online (Sandbox Code Playgroud)

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

grep -li 'regex' $(<listOfFiles.txt)
Run Code Online (Sandbox Code Playgroud)

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

listOfFiles.txt包含带有嵌入空格的文件名时会出现此问题.在我试过(见下文),所有的情况下,击分裂的空间,以便文件名,例如,在一行listOfFiles.txt 包含类似名称./this is a file.xml最终设法在每一片上运行的grep( ,,./this 和).isafile.xml

我以为我是一个相对先进的Bash用户,但我找不到一个简单的魔术咒语来让这个工作.这是我尝试过的东西.

grep -li 'regex' `cat listOfFiles.txt`
Run Code Online (Sandbox Code Playgroud)

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

grep -li 'regex' `sed -e 's/.*/"&"/' listOfFiles.txt`
Run Code Online (Sandbox Code Playgroud)

Bash将引号解释为文件名的一部分,并为每个文件提供"No such file or directory"(并且仍然使用空格分割文件名)

for i in $(<listOfFiles.txt); do grep -li 'regex' "$i"; done
Run Code Online (Sandbox Code Playgroud)

这未按原始的尝试(也就是说,它的行为就好像引号被忽略),是非常缓慢的,因为它必须每个文件启动一个"grep"可以替代过程在处理一个调用的所有文件.

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

eval grep -li 'regex' `sed -e 's/.*/"&"/' listOfFiles.txt`
Run Code Online (Sandbox Code Playgroud)

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

bash command-line

25
推荐指数
3
解决办法
2万
查看次数

标签 统计

bash ×1

command-line ×1