我有一个包含许多带子文件夹(/ ...)的文件夹的文件夹,其中包含以下结构:
_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命令实现吗?
答案 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'
或者您可以使用“扩展正则表达式”版本(egrep
或grep -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
)
注:
[0-9]*
改为[0-9]+
答案 3 :(得分:0)
您可以使用此命令:
find . -type d | grep -P "_[0-9]*_[a-z.]+/combined"