Si quisiera copiar todos los *.soarchivos de srca dst, lo haría:
cp src/*.so dst
Sin embargo, quiero copiar todos los *.soarchivos de src y se subdivide en dst. ¿Alguna pista?
Si quisiera copiar todos los *.soarchivos de srca dst, lo haría:
cp src/*.so dst
Sin embargo, quiero copiar todos los *.soarchivos de src y se subdivide en dst. ¿Alguna pista?
Respuestas:
Tratar:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grepsuperan con creces los patrones de shell simples utilizados en el -nameparámetro find. xargsTambién es mucho más poderoso que el -execpará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 dotglobopció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 dstcon 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 cpahora es "solo" el directorio de destino). El comando se puede hacer aún más corto (y probablemente más rápido) utilizando la -tbandera: ... | 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/ \;
cpprocesos: ... -exec cp -t dst/ {} +.
-execcon ;, {}se reemplaza por un camino a la vez. Obtiene un separado cppara cada archivo. Con la +sintaxis findreemplaza {}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/{}
findpuede hacer coincidir patrones y ejecutar comandos. No es necesario canalizar su salida:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'