Si no lo ha tar
con --transform
Esto puede obras:
TRG=/target/some/where
SRC=/my/source/dir
cd "$SRC"
find . -type f -name \*.\* -printf "mkdir -p '$TRG/%h' && cp '%p' '$TRG/%p'\n" |\
sed 's:/\.::;s:/./:/:' |\
xargs -I% sh -c "%"
No hay espacios después de la \
, necesitan extremo de la línea sencilla, o puede unirse a una línea como:
find . -type f -name \*.\* -printf "mkdir -p '$TRG/%h' && cp '%p' '$TRG/%p'\n" | sed 's:/\.::;s:/./:/:' | xargs -I% sh -c "%"
Explicación:
- del
find
encontrará todos archivos planos lo que tiene extensiones en ti SRC (fuente) guía
- de
printf
preparará los comandos shell necesarios del hallazgo: comando
- para crear el árbol de directorios necesaria en el TRG (dir objetivo)
- comando para copiar
sed
el camino haciendo limpieza cosmética, (como /some/path/./other/dir corregir)
- la
xargs
se toman toda la línea
- y ejecutar los comandos preparados con la cáscara
embargo, será mucho mejor:
- simplemente crea un exacta copia de primera etapa
- renombrar archivos en el 2 ° paso
más fácil, más limpio y más RÁPIDO (no necesita c hecking/creando los subdires de destino)!
¿Cuál debería ser el comportamiento si hay dos archivos (por ejemplo, 1.txt y 1.jpg) en el mismo directorio que tienen el mismo nombre además de la extensión? –
todos los nombres de archivo vienen precedidos de una identificación única, por lo que no existe el riesgo de nombrar colisiones. – user1345178