Copiar y cambiar el nombre en caso de colisión

Copiar y cambiar el nombre en caso de colisión

Me gustaría fusionar el contenido de estas carpetas con una línea de comando.

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

Cómo puedo hacer esto ?

Respuesta1

Finalmente puedo hacer esto con cpy su--backupbandera.

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

Respuesta2

El siguiente bucle de línea de comandos copiará el contenido (de nivel superior) de cada carpeta llamada "carpeta*" en su directorio actual en un directorio llamado "nuevo_directorio". El /*globo, de forma predeterminada, no coincidirá con los "archivos punto"; Úselo shopt -s dotglobsi desea cambiar ese comportamiento. Si el mismo nombre de archivo (base) ya existe en nuevo_directorio, entonces antepone al archivo de destino la carpeta de origen (y un guión bajo), para hacerlo único.

Todo en una sola línea:

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

Desglosado para facilitar la lectura:

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

Si en lugar de eso tienes la intención demoverlos archivos de sus ubicaciones originales, simplemente cambie cp's a mv's.

información relacionada