Вопрос или проблема
Я использую 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/{} \;
Объяснение команды:
-
cd /path/to/corrections-dir
: Перемещение в каталог с исправленными файлами, что позволяетfind
работать с относительными путями. -
find .
: Найти все файлы в текущем каталоге и его подкаталогах. -
-type f
: Ограничение поиска только на файлы (так мы игнорируем каталоги). -
-exec mv -f {}
: Для каждого найденного файла (представленного как{}
) выполнить командуmv
. Опция-f
гарантирует, чтоmv
будет без запроса перезаписывать существующие файлы. -
/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. Следуя этой инструкции, вы сможете управлять файлами в своей системе более эффективно и безопасно.