Copie todos los archivos de los subdirectorios y subdirectorios al directorio principal modificando los nombres de los archivos agregando el prefijo de todos los directorios principales.

Copie todos los archivos de los subdirectorios y subdirectorios al directorio principal modificando los nombres de los archivos agregando el prefijo de todos los directorios principales.

Siguiendo estas dos publicaciones:

https://askubuntu.com/questions/871898/move-files-to-parent-directory-prefixing-file-name-with-former-subdirectory-nam

https://askubuntu.com/questions/870844/recursively-add-directory-name-to-file-name

Me gustaría hacer lo mismo pero copiando en lugar de mover. Entonces, simplemente, tengo un directorio que contiene subdirectorios y subdirectorios, donde hay algunos archivos dentro. Quiero copiar todos los archivos a otra carpeta de destino, pero como algunos archivos tienen nombres exactos, quiero adjuntar el nombre de los directorios principales como prefijo a los nombres de los archivos.

Estoy ejecutando ubuntu 16.04

Respuesta1

Intentar:

find  -name "*.dat" -exec bash -c 'echo cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"' tinyscript {} \;

(elimine el "eco" si los comandos se ven bien)

.
└── 1
    └── 2
        ├── 3
        │   └── 4
        │       └── foo.dat
        └── foo.dat

Rendimientos:

cp ./1/2/3/4/foo.dat ./1-2-3-4-foo.dat
cp ./1/2/foo.dat ./1-2-foo.dat

Básicamente, ejecuta un pequeño script ad-hoc ( cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"en cada archivo que coincide y este script genera el nombre de destino reemplazando todo /en la ruta de origen por un -. La tinyscriptcadena puede ser cualquier cosa, es solo un nombre que se usa como nombre del script). en caso de errores.

Respuesta2

Al favorecer la simplicidad sobre el rendimiento, esto no es particularmente eficiente (debido a que se inicia un proceso bash para cada archivo). Si tiene muchos archivos y/o el tiempo es un factor, es posible que necesite una solución más complicada.

find yourdirectory/ -type f -print0 | xargs -0 -I% bash -c 'F="%" ; echo cp "${F}" "${F//\//-}"'

información relacionada