Рекурсивно переместить и перезаписать

Вопрос или проблема

Я использую Ubuntu 24.10 и у меня есть каталог с файлами и подкаталогами:

main-dir
   file1
   file2
   file3
   subdir1
      file1-1
      file1-2
      subdir1-1
         file1-1-1
         file1-1-2
      subdir1-2
         file1-2-1
         subdir1-2-1
            ...

И у меня есть дерево каталогов, содержащее “исправленные” файлы:

corrections-dir
   file2
   subdir1
      file1-1
      subdir1-1
         file1-1-1
      subdir1-2
         file1-2-1

Я хочу рекурсивно переместить и перезаписать все файлы из corrections-dir в main-dir. Тем не менее, команда mv не имеет, похоже, рекурсивного варианта. Я знаю, что вместо этого я мог бы сделать так:

cp -R corrections-dir main-dir
rm -r corrections-dir

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

Существует ли способ рекурсивного использования mv?

Вы можете использовать find для выполнения рекурсивных операций.

cd /path/to/corrections-dir
find . -type f -exec mv -f {} /path/to/main-dir/{} \;

(не тестировалось)

Эта команда не обрабатывает случай подкаталогов, которые существуют в corrections-dir, но не в main-dir.

Примечание: Я использую cd /path/to/corrections-dir с find . вместо find /path/to/corrections-dir, потому что я хочу, чтобы find передавал относительные имена файлов в {}.

Ответ или решение

Вопрос о том, как рекурсивно переместить файлы и перезаписать их в Ubuntu 24.10, действительно требует внимательного подхода, особенно когда речь идет о больших объемах данных и здоровье жесткого диска. Давайте рассмотрим несколько методов, начиная с тех, которые наиболее эффективно решают поставленную задачу.

Проблема

Ваша исходная структура каталогов включает main-dir, содержащий файлы и подкаталоги, а также corrections-dir, который содержит файлы, подготовленные для замены. Вы хотите переместить и перезаписать файлы из corrections-dir в main-dir без необходимости копирования, так как это потребует больше времени и приведет к износу SSD.

Решение

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

cd /path/to/corrections-dir
find . -type f -exec mv -f {} /path/to/main-dir/{} \;

Объяснение команды:

  1. cd /path/to/corrections-dir: Перемещение в каталог с исправленными файлами, что позволяет find работать с относительными путями.

  2. find .: Найти все файлы в текущем каталоге и его подкаталогах.

  3. -type f: Ограничение поиска только на файлы (так мы игнорируем каталоги).

  4. -exec mv -f {}: Для каждого найденного файла (представленного как {}) выполнить команду mv. Опция -f гарантирует, что mv будет без запроса перезаписывать существующие файлы.

  5. /path/to/main-dir/{}: Задаем целевой путь. Значение {} будет заменено относительным путем каждого найденного файла.

Важный момент:

Данная команда не обрабатывает подкаталоги, которые существуют в corrections-dir, но отсутствуют в main-dir. Чтобы избежать ошибок при попытке перезаписа файлов, структуру подкаталогов лучше создать заранее. Это можно сделать с помощью команды:

cd /path/to/corrections-dir
find . -type d -exec mkdir -p /path/to/main-dir/{} \;

Это создаст недостающие директории в main-dir, прежде чем вы начнете перемещать файлы.

Заключение

Используя команду find совместно с mv, вы сможете эффективно переместить и перезаписать файлы из одной директории в другую в Ubuntu 24.10. Вы избегаете ненужного копирования данных, что способствует продлению срока службы вашего SSD. Следуя этой инструкции, вы сможете управлять файлами в своей системе более эффективно и безопасно.

Оцените материал
Добавить комментарий

Капча загружается...