查找并移动所有.c和.cc文件的脚本unix



我正在尝试使用bash制作一个脚本来定位和移动所有.c和.cc文件。如果用户想要,路径可以不同。

#!/bin/bash
echo "Give me path if you want"
read -t 10 ANS
if [ -z "$ANS" ]; then
find ~/testfiles2 ( -name "*.c" -o -name ".cc" ) -exec mv -i '{}' ~/destination ;
else
find ~/testfiles2 ( -name "*.c" -o -name ".cc" ) -exec mv -i '{}' $ANS ;
fi

我得到的错误是";没有这样的文件或目录";。

此外,当我运行find ~/testfiles2 ( -name "*.c" -o -name ".cc" ) -exec mv -i '{}' ~/destination ;时,它会运行,但只移动.cc文件。

您的第一个错误No such file or directory可能是由于您要将文件移动到的目标目录不存在-您可以尝试创建该目录(例如mkdir target(,然后运行命令(提供target作为输入(吗?

您的第二个命令不起作用,因为您有一些打字错误;首先,需要在括号及其内容之间插入一个空格,因此...-name ".cc")应该是...-name ".cc" )。其次,使用.cc文件的选择器,除了字面名称为"的文件外,您不会匹配任何内容;。cc"——我想你错过了那个通配符。实际上,我希望这个命令在编写时只会移动.c文件,并跳过.cc文件(而不是字面上称为.cc的文件(。修复了空间问题和通配符问题,您可能想要一个看起来像的东西

find ~/testfiles2 ( -name "*.c" -o -name "*.cc" ) -exec mv -i '{}' ~/destination ;

这是假设您的~/destination目录已经存在。

最后,通过使用带有find!我们不是通过名称匹配,而是通过正则表达式匹配:

find ~/testfiles2 -iregex '.*.(c|cc)$' -exec mv -i '{}' ~/destination ;

这看起来可能很复杂,但结果如下:

  • .*表示匹配单个字符0次或多次;这里的.不是文字周期,而是单个字符的正则表达式占位符,并且*表示"0";匹配前面的字符0次或更多次";。表达式的这一部分将与文件名的开头相匹配,直至其扩展名
  • CCD_ 12表示匹配文字句点字符-我们必须";逃逸;在字符前面加一个反斜杠,告诉find该字符应按字面意思解释,而不是作为其正则表达式值(匹配任何字符(
  • (c|cc)这看起来比它应该做的更疯狂,因为我们必须在这里做一些逃离;像(c|cc(这样的正则表达式将匹配字符CCD_ 15或字符cc;CCD_ 17管道字符界定不同的可能匹配。你可以在那里添加你想添加的数量,例如,如果你想匹配mp4,你也可以这样做(c|cc|mp4(。然而,为了告诉find将括号()和管道|解释为特殊含义的正则表达式字符,我们还需要转义这些字符,剩下(c|cc)
  • $此正则表达式字符与行尾匹配

总之,这将匹配以.c或.cc.结尾的所有文件前缀(.*(

最新更新