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