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

rmi*_*sen 2 linux cygwin bash shell command-line

有时您正在处理包含空格的文件和文件夹。问题是任何时候您尝试将包含空格的文件/文件夹通过管道传输到另一个命令行程序时,包含空格的文件/文件夹都会被解释为单独的参数而不是单个参数。例如,考虑以下目录树:

Folder With Spaces
Folder With Spaces/FolderWithoutSpaces
Folder With Spaces/FolderWithoutSpaces/file with spaces.txt
FolderWithoutSpaces
FolderWithoutSpaces/fileWithoutSpaces.txt
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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

例子:

find . -type f -exec grep stuff '{}' \;
Run Code Online (Sandbox Code Playgroud)

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

find手册页:

-exec 命令 ;

    执行命令;如果返回 0 状态,则为 true。在遇到find由“ ;”组成的参数之前,所有以下参数都被视为命令的参数。字符串 ' {}' 被当前正在处理的文件名替换,它出现在命令的参数中的任何地方,而不仅仅是在单独存在的参数中,如在某些版本的find. 这两种结构都可能需要转义(使用“ \”)或引用以防止它们被 shell 扩展。有关使用该选项的示例,请参阅示例部分-exec。指定的命令对每个匹配的文件运行一次。该命令在起始目录中执行。

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