我有这行cp $(find "$directory" -type f | grep -iE '\.(c|cc|cpp|cxx)$') ~/src
搜索给定目录(在本例中$directory
为 /home)并将所有扩展名为 .c、.cc、.cpp 和 .cxx 的文件复制到 src 文件夹中,但出现 cp 错误:无法统计directory
:没有这样的文件或目录。
我认为将目录放在引号中会阻止这种情况。我究竟做错了什么?
错误来自 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