У меня есть две директории images и images2 с этой структурой в 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 . Нет смысла делать это вручную с помощью цикла оболочки, если вы не хотите перемещать файл, а не копировать его.
В твоем случае:
(Обратите внимание на косую черту
images2
, в противном случае она будет скопирована в/images/images2
.)Если изображения с тем же именем существует в обоих каталогах, вышеприведенная команда будет перезаписывать
/images/SOMEPATH/SOMEFILE
с/images2/SOMEPATH/SOMEFILE
. Если вы хотите заменить только старые файлы, добавьте эту опцию-u
. Если вы хотите всегда сохранять версию/images
, добавьте эту опцию--ignore-existing
.Если вы хотите переместить файлы из
/images2
rsync, вы можете передать эту опцию--remove-source-files
. Затем rsync копирует все файлы по очереди и удаляет каждый файл, когда это будет сделано. Это намного медленнее, чем перемещение, если каталоги источника и назначения находятся в одной файловой системе.источник
rsync
, а затемrm -r /images
.rsync -a images images2
, он просто скопирует images2 в изображения, а не объединит их.Лучший выбор, как уже было сказано, это, конечно, rsync. Тем не менее, унисон будет отличным программным обеспечением для этой работы. Оба могут использоваться в нескольких операционных системах.
Rsync
rsync синхронизируется в одном направлении от источника к месту назначения. Поэтому следующее утверждение
синхронизирует все от источника до места назначения . Объединенная папка находится в пункте назначения .
-a означает «архив» и рекурсивно копирует все из источника в место назначения, сохраняя почти все.
-v дает больше выходных данных ("подробный").
-ч для человека читабельно.
- прогресс, чтобы показать, сколько работы сделано.
Если вы хотите только обновить в целевую папку с новыми файлами из исходной папки:
унисон
унисон синхронизируется в обоих направлениях. Поэтому следующее утверждение
синхронизирует обе директории в обоих направлениях и, наконец, источник равен месту назначения. Это все равно что дважды выполнять rsync от источника к месту назначения и наоборот.
Для более продвинутого использования посмотрите справочные страницы или следующие веб-сайты:
источник
rsync -avh --progress source/ destination/
, иначе исходная папка будет создана в папке назначения, по крайней мере, в моем случае, как это было.Выполните цикл по всему содержимому,
images2
используя расширенный глобус (чтобы избежать проблем с синтаксическим анализомls
), затемmv
содержимое этих элементов до соответствующей записи вimages
. Использует,basename
чтобы лишить ведущийimages2
от сгущенного пути.источник
@ inulinux12, вы можете использовать следующий однострочный
for
цикл из командной строки:Это переместит все файлы из
images2
кimages
в соответствующих каталогах. Примечание: предполагается, что ни один файл не имеет одинакового имени.Например:
До исполнения:
После исполнения:
источник
ls
. mywiki.wooledge.org/ParsingLsbasename
в этой конкретной ситуации (не нужно вызыватьbasename
это). Еще раз спасибо за конструктивные комментарии.