Si quisiera copiar todos los *.so
archivos de src
a dst
, lo haría:
cp src/*.so dst
Sin embargo, quiero copiar todos los *.so
archivos de src y se subdivide en dst
. ¿Alguna pista?
Tratar:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
find
puede hacer coincidir patrones y ejecutar comandos. No es necesario canalizar su salida:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'
grep
superan con creces los patrones de shell simples utilizados en el-name
parámetrofind
.xargs
También es mucho más poderoso que el-exec
parámetrofind
.Si está utilizando Bash, puede activar la
globstar
opción de shell para que coincida con archivos y directorios de forma recursiva:Si necesita buscar archivos cuyos nombres comiencen con
.
, y / o archivos en y bajo directorios cuyos nombres comiencen con.
, configure ladotglob
opción también (por ejemplo, conshopt -s dotglob
). Puede configurarlos en un solo comando:fuente
Probé el comando sugerido por Mike:
pero terminó volcando todos los archivos en el directorio
dst
con sus rutas relativas perdidas.Para mantener las rutas relativas, el comando debe modificarse para esto:
fuente
dst
. En caso de que no sea así, úselocp --parents
. Además, asegúrese de citar los nombres de archivo. Por lo tanto:... | xargs -i cp --parents "{}" dst
(tenga en cuenta que el último argumento paracp
ahora es "solo" el directorio de destino). El comando se puede hacer aún más corto (y probablemente más rápido) utilizando la-t
bandera:... | xargs cp --parents -t dst
.... | xargs cp {} --parents -t dst.
Otra forma de hacer esto es así:
fuente
cp
procesos:... -exec cp -t dst/ {} +
.-exec
con;
,{}
se reemplaza por un camino a la vez. Obtiene un separadocp
para cada archivo. Con la+
sintaxisfind
reemplaza{}
con múltiples resultados (hasta un límite definido por el sistema de longitud de la línea de comando; restricción:{}
debe ser lo último antes+
, por lo tantocp -t
). Crear y finalizar un proceso es algo relativamente costoso. Por esta razón, es bueno usarlo+
cuando esperes muchos resultados. En este caso, copiar muchos archivos puede tomar mucho tiempo de todos modos, por lo que la diferencia puede pasar desapercibida; Sin embargo, es una buena práctica.El grep puede reemplazarse usando find's -name :
fuente