Какой-либо способ синхронизировать структуру каталогов, когда файлы уже с обеих сторон?

У меня есть два диска с теми же файлами, но структура каталогов полностью отличается.

Там какой-либо путь состоит в том, чтобы 'переместить' все файлы в целевую сторону так, чтобы они соответствовали структуре исходной стороны? Со сценарием, возможно?

Например, диск A имеет:
/foo/bar/123.txt
/foo/bar/234.txt
/foo/bar/dir/567.txt

Принимая во внимание, что диск B имеет:
/some/other/path/123.txt
/bar/doo2/wow/234.txt
/bar/doo/567.txt

Рассматриваемые файлы огромны (800 ГБ), таким образом, я не хочу перекопировать их; я просто хочу синхронизировать структуру путем создания необходимых каталогов и перемещения файлов.

Я думал о рекурсивном сценарии, который найдет каждый исходный файл на месте назначения, затем переместить его в каталог соответствия, создавая его при необходимости. Но это вне моих способностей...

Любая справка значительно ценится!

Спасибо

1
задан 27.01.2011, 22:08

1 ответ

Учитывая, что Ваши имена файлов уникальны, это будет работать, хотя медленно:

#!/bin/sh

src=$1
tgt=$2

# Iterate over all the filenames in the source directory.
(cd $src && find . -type f -print) | while read src_path; do
    src_dir=$(dirname "$src_path")
    src_base=$(basename "$src_path")

    # find the file on the target with the same name.
    tgt_path=$(find $tgt -name "$src_base")

    # skip to next file if there's no matching filename
    # in the target directory.
    [ "$tgt_path" ] || continue

    # create the destination directory and move the file.
    mkdir -p "$tgt/$src_dir"
    mv "$tgt_path" "$tgt/$src_dir"
done

Обратите внимание, что (a) нет большой проверки ошибок, продолжающейся здесь, (b) это будет требовать времени, если у Вас будет много файлов и (c) как записано, это, вероятно, оставит много пустых каталогов в цели.

Вот мое ограниченное тестирование. С исходным каталогом, который похож на это:

$ find src -type f
src/b/file2.txt
src/a/file1.txt
src/c/file3.txt

И целевой каталог, который похож на это:

$ find tgt -type f
tgt/file1.txt
tgt/file2.txt
tgt/not/the/right/place/file3.txt

Если у меня есть вышеупомянутый сценарий в названном файле reorg.sh и выполненный это как это:

$ sh reorg.sh src tgt

Я заканчиваю с целевым каталогом, который похож на это:

$ find tgt -type f
tgt/b/file2.txt
tgt/a/file1.txt
tgt/c/file3.txt
3
ответ дан 12.12.2019, 10:36

Теги

Похожие вопросы