Как на линуксе скопировать все файлы из одного каталога в другой, с переименованием файлов с одинаковым названием?
Linux Ubuntu 18.04 Имеется каталог, допустим papka1, нужно все файлы из этого каталога скопировать в другой, предположим papka2. Если имеются файлы с одинаковыми именами, то при копировании изменить имя, добавив к нему «.1», например, file.c скопировать в file.c.1 Команда 'cp' позволяет копировать разом все файлы, но не могу понять как сохранить оба(там выбор либо перезаписать либо нет) В идеале сделать это вообще без команды 'cp', может быть через цикл 'for'?
Ответы (3 шт):
например, с помощью программы rsync с опциями --backup (-b) и --suffix=.
демонстрация:
$ mkdir 1 2
$ echo 123 > 1/1
$ echo 456 > 2/1
$ find -type f -exec md5sum {} \;
d2d362cdc6579390f1c0617d74a7913d ./2/1
ba1f2511fc30423bdbb183fe33f3dd0f ./1/1
$ rsync -r --backup --suffix=.1 1/ 2/
$ find -type f -exec md5sum {} \;
ba1f2511fc30423bdbb183fe33f3dd0f ./2/1
d2d362cdc6579390f1c0617d74a7913d ./2/1.1
ba1f2511fc30423bdbb183fe33f3dd0f ./1/1
как видим, предыдущее содержимое файла 2/1 было сохранено в файле 2/1.1
еще как вариант вместо простой нумерации привязать к времени создания дубля
Создадим полигон:
$ rm -rf test; mkdir -p test/{1,2}; touch test/1/{a..d};touch test/2/{c..f}; tree test
test
├── 1
│ ├── a
│ ├── b
│ ├── c
│ └── d
└── 2
├── c
├── d
├── e
└── f
2 directories, 8 files
копируем:
$ cp -r --suffix=".$(date '+%s').bak" test/1/* test/2; tree test
test
├── 1
│ ├── a
│ ├── b
│ ├── c
│ └── d
└── 2
├── a
├── b
├── c
├── c.1665145369.bak
├── d
├── d.1665145369.bak
├── e
└── f
2 directories, 12 files
при желании всегда можно перевести время командой
$ date -d@1665145369
Пт 07 окт 2022 15:22:49 EEST