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?
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?
Respuestas:
Tratar:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grep
superan con creces los patrones de shell simples utilizados en el -name
parámetro find
. xargs
También es mucho más poderoso que el -exec
parámetro find
.
Si está utilizando Bash, puede activar la globstar
opción de shell para que coincida con archivos y directorios de forma recursiva:
shopt -s globstar
cp src/**/*.so dst
Si necesita buscar archivos cuyos nombres comiencen con .
, y / o archivos en y bajo directorios cuyos nombres comiencen con .
, configure la dotglob
opción también (por ejemplo, con shopt -s dotglob
). Puede configurarlos en un solo comando:
shopt -s globstar dotglob
Probé el comando sugerido por Mike:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
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:
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst
. En caso de que no sea así, úselo cp --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 para cp
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í:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cp
procesos: ... -exec cp -t dst/ {} +
.
-exec
con ;
, {}
se reemplaza por un camino a la vez. Obtiene un separado cp
para cada archivo. Con la +
sintaxis find
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 tanto cp -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 :
find src/ -type f -name "*.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/ ';'