如何将包含空格的文件或文件夹作为参数传递给 GNU/Linux 或 Cygwin 环境中的命令行程序?

如何将包含空格的文件或文件夹作为参数传递给 GNU/Linux 或 Cygwin 环境中的命令行程序?

有时,您需要处理包含空格的文件和文件夹。问题是,每当您尝试将包含空格的文件/文件夹传送到另一个命令行程序时,包含空格的文件/文件夹都会被解释为单独的参数,而不是单个参数。例如,考虑以下目录树:

Folder With Spaces
Folder With Spaces/FolderWithoutSpaces
Folder With Spaces/FolderWithoutSpaces/file with spaces.txt
FolderWithoutSpaces
FolderWithoutSpaces/fileWithoutSpaces.txt

如果你尝试运行 shell 命令,例如“grep 'some text' $(find . -type f)”,你将获得以下输出:

grep: ./Folder: No such file or directory
grep: With: No such file or directory
grep: Spaces/FolderWithoutSpaces/file: No such file or directory
grep: with: No such file or directory
grep: spaces.txt: No such file or directory

最大的问题是,如何将包含空格的文件/文件夹作为参数传送给命令行程序?

答案1

您最好使用-exec操作(选项)find 并引用您的论点。

例子:

find . -type f -exec grep stuff '{}' \;

引号将使空格不被解释,并且您不必不必要地将所有内容通过管道传输xargs

find手册页中:

-exec 命令 ;

    执行命令;如果返回 0 状态,则为 true。所有后续参数都find被视为命令的参数,直到包含 ';遇到 '。字符串 ' {}' 在命令参数中出现时会被替换为当前正在处理的文件名,而不仅仅是在单独出现的参数中,就像 的某些版本一样find。这两种构造可能需要转义(使用 ' \')或用引号引起来,以防止它们被 shell 扩展。请参阅例子部分中提供了使用该-exec选项的示例。指定的命令针对每个匹配的文件运行一次。该命令在起始目录中执行。

    使用该操作存在不可避免的安全问题-exec;您应该使用该-execdir选项。

答案2

使用 xargs 管道传入您的参数,方法是用空字符分隔上述程序中的命令行参数,并将“-0”选项传递给 xargs,如下所示:

find . -type f -print0 | xargs -0 grep -l "some text"

此命令将把任何包含空格的文件/文件夹作为单个参数而不是单独的参数传递。

答案3

在空格前使用反斜杠字符“\”:

[randerson@localhost ~]$ mkdir Folder\ With\ Spaces
[randerson@localhost ~]$ ls | grep Folder\ With\ Spaces
Folder With Spaces
[randerson@localhost ~]$ 

答案4

将文件名括在单引号或双引号中:

$ mkdir "Folder With Spaces"
$ ls | grep "Folder With Spaces"
Folder With Spaces
$ ls | grep 'Folder With Spaces'
Folder With Spaces

shell 将扩展双引号内的变量:

$ FOO=With
$ ls | grep "Folder $FOO Spaces"
Folder With Spaces

$(...)如果结果是一个文件名,您还可以引用扩展:

$ ls -d "$(echo -n Folder With Spaces)"
Folder With Spaces

这仅适用于单个文件名;对于多个文件,请按照其他答案中的建议使用find -exec或。xargs

相关内容