我正在尝试使用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.结尾的所有文件前缀(.*
(