
Siguiendo estas dos publicaciones:
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 tinyscript
cadena 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//\//-}"'