0

我有这行cp $(find "$directory" -type f | grep -iE '\.(c|cc|cpp|cxx)$') ~/src搜索给定目录(在本例中$directory为 /home)并将所有扩展名为 .c、.cc、.cpp 和 .cxx 的文件复制到 src 文件夹中,但出现 cp 错误:无法统计directory:没有这样的文件或目录。

我认为将目录放在引号中会阻止这种情况。我究竟做错了什么?

4

1 回答 1

1

错误来自 command cp,因此 quoting$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
    
于 2013-05-13T23:31:51.990 回答