$dir_ini -d *
expande a
/home/test/dir1/ -d *
dir1 no es un comando, por lo que eso da error de sintaxis. -d es un parámetro para ls, que no estás usando. En tu caso no necesitás el for. Supongo que este ls se hace para recorrer los subdirectorios, pero no sirve: no toma archivos del directorio padre ni funciona para más de 1 nivel de subdirectorios.
find .
¿Por qué buscas los archivos en la carpeta actual? supongo que lo que querés hacer es find $dir_ini
-name *.*
No es error de sintaxis pero no es lo que querés. Al hacer *.* sin comillas, bash expande a los nombres de archivo actuales y rompe el comando. Si en la carpeta actual existen los archivos a.txt y b.txt el comando queda
-name a.txt b.txt
lo cual sí es un error de sintaxis. Además, como agregaste el punto, no se considerarán archivos (o directorios) sin extensión. Mejor dejalo como * en vez de *.*, funciona como se espera. *.* es algo de DOS, no de UNIX.
exec cp $"file" $dir_fin {}
$"file" es otro error de sintaxis.
Tu segundo ejemplo es mejor, pero yo lo haría así:
Código BASH:
Ver originalcd $DIR_INI
find . -mtime -8 -exec mkdir -p $DIR_FIN/`dirname {}` \; -exec cp {} $DIR_FIN/`dirname {}` \;
Para cada archivo en el directorio actual, modificado hace menos de 8 días (es decir, en la última semana), crear su ruta en $DIR_FIN (ruta relativa a $DIR_INI) y copiarlo, conservando la estructura.
No está probado pero debería funcionar. MKDIR puede dar errores al intentar crear un directorio que ya existe, eso se puede arreglar
Saludos.