过滤到特定深度的路径

过滤到特定深度的路径

我正在使用 rsync 和标志-nPaAXz ~/来检查要复制哪些文件。

这太冗长了,无法理解。

如何过滤输出以便查看将复制到一定深度的文件/文件夹列表,例如:

1 个文件夹深

/home/afile
/home/afolder/
/home/anotherfolder/

2 个文件夹深

/home/afile
/home/afolder/afile
/home/afolder/anotherfile
/home/afolder/afolder/
/home/anotherfolder/afile

答案1

以下 grep 将 rsync 的详细输出限制为 2 个文件夹的深度:

rsync -nPaAXz src_dir dst_dir | grep -E '^/?([^/]+/?){0,2}$'

{0,2}将上面的内容更改为{0,3}以过滤掉 3 个文件夹。{0,4}将过滤掉 4 个文件夹深度等。

答案2

此命令获取每个路径并将其截断到n深层文件夹(在\{0,n\}命令部分sed{0,n}grep 命令部分中定义)。然后将其通过管道输入uniq以过滤掉重复项。

rsync -nPaAXz src_dir dst_dir | sed -n 's@^\(\([^/][^/]*/\)\{0,2\}\).*@\1@p' | uniq

使用以下方法也可以实现同样的效果grep

rsync -nPaAXz src_dir dst_dir | grep -oE "^([^/]+/){0,2}"

尽管由于以下原因,上述内容不适用于GNU grep版本< 2.5.3漏洞

答案3

在这种情况下,您只想过滤输出,实际上并不关心以任何方式重用这些值。那么这很简单:只需 grep 出包含比您想要的更多斜杠的行即可。

答案4

rsync -nPaAXz src_dir dst_dir | cut -d "/" -f 1-4 | awk '!x[$0]++'

cut 删除 4 个文件夹深度路径之后的所有内容,awk 删除重复项。

相关内容