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 cp
y su--backup
bandera.
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 dotglob
si 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.