Copiar e renomear em caso de colisão

Copiar e renomear em caso de colisão

Gostaria de mesclar o conteúdo dessas pastas com uma linha de comando.

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

Como posso fazer isso ?

Responder1

Finalmente posso fazer isso com cpe é--backupbandeira.

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

Responder2

O seguinte loop de linha de comando copiará o conteúdo (de nível superior) de cada pasta chamada "pasta*" em seu diretório atual para um diretório chamado "novo_diretório". O /*glob, por padrão, não corresponderá a "arquivos de ponto"; use shopt -s dotglobse quiser mudar esse comportamento. Se o mesmo nome de arquivo (base) já existir em new_directory, ele prefixa o arquivo de destino com a pasta de origem (e um sublinhado), para torná-lo único.

Tudo em uma linha:

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

Dividido para facilitar a leitura:

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

Se você pretende, em vez disso,moveros arquivos de seus locais originais, basta alterar os cp's' para mv's.

informação relacionada