1

У меня два диска с одинаковыми файлами, но структура каталогов совершенно другая.

Есть ли способ «переместить» все файлы на стороне назначения, чтобы они соответствовали структуре на стороне источника? С сценарием что ли?

Например, диск 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 ответ1

3

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

#!/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

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

Вот мое ограниченное тестирование. С исходным каталогом, который выглядит следующим образом:

$ 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .