比较文件结构

比较文件结构

我有两个目录结构:

dir1
├── 1
│   └── file1
├── 2
│   └── file1
├── 3
│   └── file1
├── 4
│   └── file1
├── 5
    └── file1
dir2
├── 1
├── 2
├── 5

我使用xargs mkdir -p < dirs.txt目录名称创建 file.txt。在这个文件中,我仅获得目录路径,而没有目录中的文件。如何取出仅包含目录列表的文件路径dirs.txt

例如:我需要从目录dir1结构中取出来自的文件。这应该是这样的:dir2dir1dir3

dir3
├── 1
│   └── file1
├── 2
│   └── file1
├── 5
│   └── file1

最后一步我将使用: rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory

答案1

使用命令find。可以使用-type标志指示仅查找目录,使用标志指示-path仅查找与路径匹配的项目。例如,

find . -path './dir1/*' -type d

只会列出 下的所有目录和子目录dir1。然后您可以将其重定向到一个dirs.txt文件,并按您想要的方式编辑该文件。

答案2

这些任务的困难通常是当你需要匹配路径中间的某些内容时,在这种情况下,你似乎可以从两个目录列表中匹配第二级。我还假设你在任何路径中都没有换行符。

awk -F / -vOFS=/ -vf=2 'NR==FNR {a[$f]++; next} $f in a {$1=""; print $0}' \
      <(printf %s\\n dir2/*) dirs.txt | rsync -avx --files-from=- dir1/ dir3

将分隔符设置-F/基本上使得字段在不同的路径组件中,初始点将成为第二个字段。第一个模式动作 NR==FNR {}将第一个文件读入数组,即的目录列表dir2。当第一个文件到达末尾时,NR==FNR变为 false,第二个文件将由下一个模式动作处理。在打印路径之前,初始点必须将其删除以说明 rsync 的源/目标。

相关内容