BASH - 找到具有查找和使用正则表达式过滤的特定文件夹

时间:2012-08-22 13:31:42

标签: regex bash

我有一个包含许多带子文件夹(/ ...)的文件夹的文件夹,其中包含以下结构:

_30_photos/combined
_30_photos/singles
_47_foo.bar
_47_foo.bar/combined
_47_foo.bar/singles
_50_foobar

使用命令find . -type d -print | grep '_[0-9]*_'将显示结构为 ** 的所有文件夹。但是我生成了一个只捕获* /组合文件夹的正则表达式: _[0-9]*_[a-z.]+/combined但是当我将其插入到find命令时,不会打印任何内容。

下一步是为每个组合文件夹(我的硬盘上某处)创建一个文件夹,并将组合文件夹的内容复制到新文件夹。新文件夹名称应与子文件夹的父名称相同,例如_47_foo.bar。可以在搜索后使用xargs命令实现吗?

4 个答案:

答案 0 :(得分:4)

你不需要grep:

find . -type d -regex ".*_[0-9]*_.*/combined"

其余的:

find . -type d -regex "^\./.*_[0-9]*_.*/combined" | \
   sed 's!\./\(.*\)/combined$!& /somewhere/\1!'   | \
   xargs -n2 cp -r

答案 1 :(得分:3)

使用基本grep,您需要转义+

... | grep '_[0-9]*_[a-z.]\+/combined'

或者您可以使用“扩展正则表达式”版本(egrepgrep -E [谢谢chepner]),其中+不必转义。

xargs可能不是您上面描述的最灵活的复制方式,因为与multiple commands一起使用会很棘手。您可以通过while循环找到更多灵活性:

... | grep '_[0-9]*_[a-z.]\+/combined' | while read combined_dir; do 
    mkdir some_new_dir
    cp -r ${combined_dir} some_new_dir/
done

如果您想要一种自动化some_new_dir名称的方法,请查看bash string manipulation

答案 2 :(得分:1)

target_dir="your target dir"

find . -type d -regex ".*_[0-9]+_.*/combined" | \
  (while read s; do
     n=$(dirname "$s")
     cp -pr "$s" "$target_dir/${n#./}"
   done
  )

注:

  • 如果目录名
  • 中有换行符“\ n”,则会失败
  • 这使用子shell来使你的环境不混乱 - 在一个你不需要的脚本里面
  • 稍微更改了正则表达式:[0-9]*改为[0-9]+

答案 3 :(得分:0)

您可以使用此命令:

find . -type d | grep -P "_[0-9]*_[a-z.]+/combined"