Respuestas:
Tratar:
find . -type d -regex './[a-z]*' -exec bash -c 'cp -v "$1"/* ..' Cp {} \;
Considerar:
find . -type d -regex './[a-z]*' -exec cp -v {}/* .. \;
Cuando bash ve esta línea, realiza la expansión del nombre de ruta en {}/*
. Como allí (normalmente) no hay un directorio con nombre {}
, *
se deja como literal *
. Esto no es lo que quieres. Necesita que se produzca la expansión del nombre de ruta después de find
haber sustituido {}
. Al poner el cp
comando entre comillas y pasarlo como argumento bash -c
, logramos ese objetivo.
Un formulario de muestra para bash -c
parecerse a:
bash -c 'code...' a b c
Esto le dice a bash que asigne a
a $0
, b
a $1
, c
a $2
y luego ejecute code...
. Si se produce un error, el shell se usa $0
como el nombre del programa que se está ejecutando (en el mensaje de error). Arriba, elegimos Cp
como nombre descriptivo. Además, como arriba, {}
se sustituye $1
y usamos $1
en el code...
. Cuando se usa de esta manera, {}
no necesita ser citado (pero no hace daño si lo hace); find
maneja cualquier escape que sea necesario. code...
Sin embargo, el interior $1
debe estar entre comillas dobles para proteger contra la división de palabras y la expansión del nombre de ruta.