У меня есть два диска с теми же файлами, но структура каталогов полностью отличается.
Там какой-либо путь состоит в том, чтобы 'переместить' все файлы в целевую сторону так, чтобы они соответствовали структуре исходной стороны? Со сценарием, возможно?
Например, диск 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 ГБ), таким образом, я не хочу перекопировать их; я просто хочу синхронизировать структуру путем создания необходимых каталогов и перемещения файлов.
Я думал о рекурсивном сценарии, который найдет каждый исходный файл на месте назначения, затем переместить его в каталог соответствия, создавая его при необходимости. Но это вне моих способностей...
Любая справка значительно ценится!
Спасибо
Учитывая, что Ваши имена файлов уникальны, это будет работать, хотя медленно:
#!/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