我有两个目录结构:
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
结构中取出来自的文件。这应该是这样的:dir2
dir1
dir3
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 的源/目标。