Как на линуксе скопировать все файлы из одного каталога в другой, с переименованием файлов с одинаковым названием?

Linux Ubuntu 18.04 Имеется каталог, допустим papka1, нужно все файлы из этого каталога скопировать в другой, предположим papka2. Если имеются файлы с одинаковыми именами, то при копировании изменить имя, добавив к нему «.1», например, file.c скопировать в file.c.1 Команда 'cp' позволяет копировать разом все файлы, но не могу понять как сохранить оба(там выбор либо перезаписать либо нет) В идеале сделать это вообще без команды 'cp', может быть через цикл 'for'?


Ответы (3 шт):

Автор решения: eri
cp -r --backup=t papka1/* papka2

будет добавляться .~1~ .~2~ и т.д.

→ Ссылка
Автор решения: aleksandr barakin

например, с помощью программы 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

→ Ссылка
Автор решения: Zt.

еще как вариант вместо простой нумерации привязать к времени создания дубля

Создадим полигон:

$ 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
→ Ссылка