Копировать и переименовывать при столкновении

Копировать и переименовывать при столкновении

Я хотел бы объединить содержимое этих папок с помощью командной строки.

.
├── folder1
│   │ file.txt
├── folder2
│   │ file.txt
└───folder3
    │ file.txt

Как я могу это сделать ?

решение1

Наконец-то я могу это сделать с помощью cpи его--backupфлаг.

cp --backup=numbered */*.txt new_directory/

решение2

Следующий цикл командной строки скопирует содержимое (верхнего уровня) каждой папки с именем "folder*" в текущем каталоге в каталог с именем "new_directory". /*По умолчанию glob не будет соответствовать "dot files"; используйте, shopt -s dotglobесли хотите изменить это поведение. Если такое же (базовое) имя файла уже существует в new_directory, то он добавляет к файлу назначения префикс исходной папки (и подчеркивание), чтобы сделать его уникальным.

Все в одной строке:

for f in folder*/*; do [ ! -e "new_directory/$(basename "$f")" ] && { cp "$f" new_directory/; continue; }; [ -e "new_directory/$(basename "$f")" ] && cp "$f" "new_directory/$(dirname "$f")_$(basename "$f")"; done

Разбито для удобства чтения:

for f in folder*/*
do 
  [ ! -e "new_directory/$(basename "$f")" ] && { cp "$f" new_directory/; continue; }
  [ -e "new_directory/$(basename "$f")" ] && cp "$f" "new_directory/$(dirname "$f")_$(basename "$f")"
done

Если вы намерены вместо этогодвигатьсяфайлы из их исходных местоположений, просто замените cp«s» на mv«s».

Связанный контент