8

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

_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]*_'具有结构**的所有文件夹。但是我已经生成了一个只捕获 */combined 文件夹的正则表达式: _[0-9]*_[a-z.]+/combined但是当我将它插入到 find 命令中时,不会打印任何内容。

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

4

4 回答 4

9

您不需要 grep:

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

对于其余的:

find . -type d -regex "^\./.*_[0-9]*_.*/combined" | \
   sed 's!\./\(.*\)/combined$!& /somewhere/\1!'   | \
   xargs -n2 cp -r
于 2012-08-22T13:38:42.290 回答
4

使用 basicgrep您将需要转义+

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

或者您可以使用不需要转义的“扩展正则表达式”版本(egrepgrep -E[thanks chepner]) 。+

xargs可能不是进行上述复制的最灵活方式,因为与多个命令一起使用很棘手。您可能会发现使用 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.

于 2012-08-22T13:36:24.710 回答
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]+
于 2012-08-22T14:29:17.357 回答
0

你可以使用这个命令:

find . -type d | grep -P "_[0-9]*_[a-z.]+/combined"
于 2017-06-12T10:06:37.393 回答