macOS中cp命令使用通配符*时因引号导致执行失败的问题咨询
macOS中cp命令使用通配符*时因引号导致执行失败的问题咨询
嗨,我来帮你拆解这个问题的原因和解决办法~
问题根源
这本质是shell对通配符(*)的解析规则导致的:
- 当你把包含
*的整个路径用引号(单引号或双引号)括起来时,shell会把*当作普通的字符,而不是“匹配所有后缀为.dylib的文件”的通配符。 - 这时候
cp命令收到的参数就是字面的"/Users/my.name/Documents/GitHub/Folder/*.dylib",系统里根本没有这个名字的文件,自然会报错No such file or directory。 - 而你直接指定具体文件名的命令能成功,是因为引号里没有通配符,shell只是帮你处理了路径里的空格,把正确的文件名传给了
cp;先cd再执行cp *.dylib的情况,*在引号外,shell会正常展开它,匹配所有.dylib文件,所以也能成功。
针对含空格路径的解决办法
如果路径里有空格,同时又需要用通配符,你可以试试这几种方法:
只给含空格的路径部分加引号:把通配符留在引号外面,让shell正常解析它。比如:
cp "/Users/my.name/Documents/GitHub/Folder/"*.dylib "/Users/my.name/Documents/GitHub/OtherFolder"这里引号只包裹了有空格(如果有的话)的目录部分,
*.dylib在引号外,shell会自动展开成该目录下所有.dylib文件,同时处理了路径空格的问题。用转义字符处理空格:不用引号,而是给路径里的空格加转义符
\,通配符直接放在后面。比如:cp /Users/my.name/Documents/GitHub/Folder\/*.dylib /Users/my.name/Documents/GitHub/OtherFolder(如果
Folder是带空格的名字,比如My Folder,就写成My\ Folder)保持你已经验证有效的方法:先
cd到目标目录,再执行cp *.dylib到目标路径,这种方式既避免了长路径的空格处理,又能正常使用通配符。
备注:内容来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

