У меня есть директория для обработки например Dir/ (Documents/Dir)
В ней есть некоторое кол-во файлов к примеру file.txt readme.txt text.txt (Dir/file.txt ; Dir/readme.txt ; Dir/text.txt)
Так в этой директории есть несколько вложенных директорий, в которых есть тоже файл и один из этих файлов называется так же как file.txt, но содержат разную информацию (Dir/Dir1/file.txt ; Dir/Dir2/copybook.txt)
У меня есть директория для результатов Results (Documents/Results)
Мне нужно скопировать все файлы из Dir в Results без повторения иерархии вложенных папок в Dir с учетом файлов с одноименным названием и без потери информации. В итоге в директории Results должно получиться 5 файлов (Results/file.txt ; Results/readme.txt ; Results/text.txt ; Results/copybook.txt ; Results/file.txt ) , но так как файлов с одинаковым именем в директории не может быть, нужно переименовать один из файлов, без потери информации внутри файла.
Скрипт заведомо не знает, сколько содержится файлов и директорий в Dir
Dert1x, тут либо настраиваете текстовый редактор так, чтобы он не плевался от "нестандартного" имени файла, либо переименовывайте файлы массово (сори, изящней способа быстро не придумал):
for old in *.~*; do new="$(printf "%s.%s.txt\n" "`grep -Po '(.*)(?=.txt.~)' <<< "$old"`" "`grep -Po '\.~[0-9]+\~' <<< "$old" | grep -o '[0-9]*'`")"; mv "$old" "$new"; done
Скрипт сделает такое преобразование: file.txt.~1~ --> file.1.txt. Сработает и на файлах с пробелами в имени.
Dert1x, потому, что утилита rename существует в двух версиях. Та что в util-linux (и скорее всего у вас и стоит) не поддерживает регулярные выражения, поэтому не работает в таком виде. Другая версия (которую привели в ответе) написана на Perl и устанавливается отдельно: https://stackoverflow.com/questions/22577767/