Как скопировать два каталога?

У меня есть два каталога изображений и изображений2 с этой структурой в Linux:

/images/ad /images/fe /images/foo 

… и другие 4000 папок

а другой – как:

 /images2/ad /images2/fe /images2/foo 

… и другие 4000 папок

Каждая из этих папок содержит изображения, а имена каталогов под изображениями и изображениями 2 одинаковы, однако их содержимое отличается. Затем я хочу знать, как я могу копировать-объединить изображения / images2 / ad в images / ad, изображения / images2 / foo в images / foo и т. Д. Со всеми 4000 папками.

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

     rsync -a /images/ /images2/ 

    Если изображения с таким же именем существуют в обоих каталогах, команда выше перезапишет /images2/SOMEPATH/SOMEFILE с помощью /images/SOMEPATH/SOMEFILE . Если вы хотите заменить только старые файлы, добавьте опцию -u . Если вы хотите всегда сохранить версию в /images2 , добавьте параметр --ignore-existing .

    Если вы хотите переместить файлы из /images , с помощью rsync вы можете передать параметр --remove-source-files . Затем rsync копирует все файлы по очереди и удаляет каждый файл, когда это делается. Это намного медленнее, чем перемещение, если исходные и целевые каталоги находятся в одной файловой системе.

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

    Rsync

    rsync синхронизируется в одном направлении от источника к месту назначения. Поэтому следующее утверждение

     rsync -avh --progress Source Destination 

    синхронизирует все: от источника до места назначения . Объединенная папка находится в пункте назначения .

    означает «архив» и копирует все рекурсивно из источника в пункт назначения, сохраняя почти все.

    -v дает больше выходных данных («verbose»).

    -h для чтения человеком.

    –progress, чтобы показать, сколько работы сделано.

    Если вы хотите только обновить папку назначения с более новыми файлами из исходной папки:

     rsync -avhu --progress source destination 

    унисон

    унисон синхронизируется в обоих направлениях. Поэтому следующее утверждение

     unison Source Destination 

    синхронизирует обе директории в обоих направлениях и, наконец, источник равен месту назначения. Это как делать rsync дважды из источника в dest и наоборот.

    Для более продвинутых способов использования смотрите страницы руководства или следующие веб-сайты:

    1. https://www.cis.upenn.edu/~bcpierce/unison/
    2. https://rsync.samba.org/
     for dir in images2/*; do mv "$dir"/* "images/$(basename "$dir")"; done 

    Переверните все содержимое images2 с помощью расширенного glob (чтобы избежать проблем с разбором ls ), тогда mv содержимое этих элементов соответствует соответствующей записи в images . Использует basename для того, чтобы вырезать ведущие изображения2 с пути globbed.

    @ inulinux12, вы можете использовать следующую строку for цикла из командной строки:

     $ for dir in images2/*; do mv "$dir"/* "${dir/2/}"; done 

    Это переместит все файлы с images в images в соответствующие каталоги. Примечание. Предполагается, что файлы не имеют одинакового имени.

    Например:

    Перед выполнением:

     $ ls -R images* images: ad adfoo fe images/ad: jpg.1 jpg.2 images/adfoo: jpg.7 images/fe: jpg.5 images2: ad adfoo fe images2/ad: jpg.3 images2/adfoo: jpg.6 images2/fe: jpg.4 

    После выполнения:

     $ ls -R images* images: ad adfoo fe images/ad: jpg.1 jpg.2 jpg.3 images/adfoo: jpg.6 jpg.7 images/fe: jpg.4 jpg.5 

    Надеюсь это поможет.