在bash sh中处理目录中的空格

在bash sh中处理目录中的空格,bash,directory,sh,space,cp,Bash,Directory,Sh,Space,Cp,我有一行cp$(find“$directory”-键入f | grep-iE'\.(c | cc | cpp | cxx)$)~/src搜索给定目录(在本例中,$directory是/home),并将扩展名为.c、.cc、.cpp和.cxx的所有文件复制到src文件夹中,但是我得到一个cp错误:cannotstatdirectory:没有这样的文件或目录 我认为把目录加引号可以防止这种情况。我做错了什么?错误来自命令cp,因此引用$directory,虽然通常是个好主意,但无助于解决此错误 您的

我有一行
cp$(find“$directory”-键入f | grep-iE'\.(c | cc | cpp | cxx)$)~/src
搜索给定目录(在本例中,
$directory
是/home),并将扩展名为.c、.cc、.cpp和.cxx的所有文件复制到src文件夹中,但是我得到一个cp错误:cannotstat
directory
:没有这样的文件或目录


我认为把目录加引号可以防止这种情况。我做错了什么?

错误来自命令
cp
,因此引用
$directory
,虽然通常是个好主意,但无助于解决此错误

您的构造将失败,文件/目录名包含空格,grep结果为零匹配的情况,以及我现在想不起来的其他情况

一些更好的解决方案:

  • 使用
    find
    的名称匹配而不是
    grep
    ,并使用
    -exec

    find "$directory" -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.cxx' \) -exec cp '{}' ~/src ';'
    
    find "$directory" -type f -regextype posix-egrep -iregex '.*\.(c|cc|cpp|cxx)$' -exec cp '{}' ~/src ';'
    
  • xargs
    \0
    分隔符一起使用,而不是
    \n

    find "$directory" -type f -print0 | grep -z -iE '\.(c|cc|cpp|cxx)$' | xargs -0 -I{} cp "{}" ~/src
    
  • 如果您的文件结构是扁平的(没有子目录),只需使用
    cp

    cd "$directory"; cp *.c *.cc *.cpp *.cxx ~/src
    

不错!在第一个示例中,您应该在
-name-o-name..
部分,因为
-o
的优先级低于
-exec
前面的隐式
-a
。在第二个示例中,还可以使用
find-print0
grep-z
来消除换行问题。对于第三个,您可以
shopt-s globstar nullglob
然后使用
***.{c,cc,cpp,cxx}
递归和/或在没有.cxx文件,只有.cpp文件的情况下消除错误。您的第二个示例最好是这样:
查找“$directory”-类型f-iregex.*\(c | cc | cpp | cxx)$”-print0 | xargs-0…