2014-10-30 121 views

回答

1

试试以下find命令,该命令在要存储要移动的文件的目录中使用sed正则表达式。

find . -regextype sed -regex ".*/[a-zA-Z0-9]\+\.jpg" -exec mv "{}" /path/to/destination \; 

OR

find . -regextype sed -regex ".*/[^._]\+\.jpg" -exec mv "{}" /path/to/destination \; 

更新:

mv $(find . -name "*.jpg" -type f | grep -P '^(?!.*_\d+\.jpg).*') /path/to/destination 
+0

好吧,我没描述得很好。有很多文件,如b.jpg b_258.jpg b_6693.jpg,789c.jpg 789c_77885.jpg 789c_14.jpg,什么意思是只找到a.jpg b.jpg,789c.jpg ...没有任何“ {NO。}“,并将它们移动 – Tomo 2014-10-30 03:45:34

+0

添加到问题中。 – 2014-10-30 03:46:12

+0

@Tomo试试我的更新。 – 2014-10-30 03:53:27

1

只有当你不知道在哪里a.jpg是,只有当你知道只有一个a.jpg

find . -type f -name "a.jpg" -exec mv "{}" /anotherfolder \; 
0

要使用正则表达式做到这一点,你会做这样的事情:

find /basefoldertosearch -regex '.*/a\.jpg' -exec mv "{}" /anotherfolder \; 

注:该模式的整个路径,而不仅仅是文件名匹配。第一个点在它之前没有“\”,将匹配任何东西(并且由于星号的原因,任何数目的)。 “。”在文件名中,因为它之前有一个“\”,所以会匹配一个点。所以,这个模式将匹配以“/a.jpg”结尾的任何路径+文件名。由于这包括'*',它必须被引用。

此外,由于您知道确切的文件名,您可以搜索特定的文件名。

find /basefoldertosearch -name a.jpg -exec mv "{}" /anotherfolder \; 

请注意,这不包括路径。这也不是一个正则表达式;它会搜索与指定的文件名完全相同的文件名。在这种情况下,由于它没有''(而''实际上不起作用),所以不需要引用它。

请注意,如果其中任何一个找到多个匹配项,它会将它们全部逐一复制到相同的目的地;每个将覆盖前一个,并且您将留下它找到的最后一个文件。

补充:阅读下面的意见后,或许这就是你正在寻找:

find /basefoldertosearch ! -regex '.*[0-9].*' -type f -exec mv "{}" /anotherfolder \; 

这会发现一切不(因为!)的匹配正则表达式:任何字符.*,其次由数字[0-9]后跟其他任何字符.*。然后从列表中删除任何不是正常文件(例如导演)(否则您将移动/basefoldertosearch,并且找不到任何剩余的东西!)

+0

好的,我没有很好地描述,有很多文件,比如b.jpg b_258.jpg b_6693.jpg,789c.jpg 789c_77885.jpg 789c_14.jpg,什么意思是只找到a.jpg b.jpg,789c .jpg ...没有任何“_ {NO。}”,并且将它们移动 – Tomo 2014-10-30 03:47:02

+0

我的英语很差,对不起,也许我没有描述clea找到没有任何后缀的文件“_Numbers.jpg” – Tomo 2014-10-30 03:50:17