![Копировать и переименовывать при столкновении](https://rvso.com/image/88765/%D0%9A%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D1%8B%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BF%D1%80%D0%B8%20%D1%81%D1%82%D0%BE%D0%BB%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B8.png)
Я хотел бы объединить содержимое этих папок с помощью командной строки.
.
├── 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».