У меня есть 2 структуры директорий:
dir1
├── 1
│ └── file1
├── 2
│ └── file1
├── 3
│ └── file1
├── 4
│ └── file1
├── 5
└── file1
dir2
├── 1
├── 2
├── 5
Я использую xargs mkdir -p
dirs.txt
?
Например: мне нужно извлечь из dir1
структуру каталогов из dir2
с файлами из dir1
. Это должно выглядеть так: dir3
:
dir3
├── 1
│ └── file1
├── 2
│ └── file1
├── 5
│ └── file1
На последнем шаге я буду использовать:
rsync -a / source / directory --files-from = / full / path / to / список-файл / место назначения / каталог
Трудности с такими задачами обычно возникают, когда нужно сопоставить что-то в середине пути, в данном случае, похоже, вы можете сопоставить второй уровень из двух списков каталогов. Я также предполагаю, что у вас нет, например, новых строк в любом из путей.
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
становится ложным и второй файл будет обработан следующим действием шаблона. Перед печатью пути, start-point должен быть удален, чтобы учесть источник/назначение rsync.
Используйте команду find
. С помощью флага -type
можно указать, чтобы он находил только каталоги, а с помощью флага -path
- находить только элементы, соответствующие пути. Например,
find . -path './dir1/*' -type d
перечислит только все каталоги и подкаталоги в dir1
. Затем вы можете перенаправить его в файл dirs.txt
и отредактировать этот файл по своему усмотрению.