cómo eliminar (o mantener) ciertas extensiones de files usando busybox find?

Tengo una carpeta que contiene files (varias extensiones de files) y subcarpetas. Quiero mantener ciertas extensiones de file y eliminar el rest.

eg keep all .txt and .jpg files and delete all other files. 

en UNIX / GNU regular, puedo usar find junto con el parámetro "-not" para lograr esto.

 > find . -not -name "*.jpg" -not -name "*txt" -type f -delete 

Pero lamentablemente, este parámetro no está disponible en busybox find.

¿Alguna idea sobre cómo se puede hacer? Muchas gracias

-not y -delete son extensiones de GNU.

No hay ninguna razón por la que desee usar -not , cuando hay un equivalente estándar más corto:! .

Para -delete , tendrás que invocar rm con el pnetworkingicado -exec :

 find . ! -name '*.jpg' ! -name '*.txt' -type f -exec rm -f '{}' + 

(Si tiene una versión anterior de busybox, puede necesitar el -exec rm -f '{}' ';' que ejecuta una rm por file).

Ese command anterior es estándar, por lo que funcionará no solo en busybox sino también con otras implementaciones modernas de find no sean GNU.

Tenga en count que en los sistemas GNU, al less, ese command (con cualquier implementación de find siempre que use GNU fnmatch(3) ) aún puede eliminar algunos files cuyo nombre termine en .jpg o .txt , ya que el patrón *.jpg no podría files de coincidencia cuyo nombre contiene caracteres no válidos en la configuration regional actual.

Para solucionarlo, necesitarías:

 LC_ALL=C find . ! -name '*.jpg' ! -name '*.txt' -type f -exec rm -f '{}' + 

También tenga en count que, contrariamente a la -delete de GNU, ese enfoque no funcionará en treees de directorys muy profundos ya que terminaría alcanzando el tamaño máximo de una ruta de file pasada a la llamada al sistema unlink() . AFAIK, con find , no hay forma de -execdir si su implementación find no admite -execdir ni -delete .

También puede leer las consideraciones de security que se analizan en el manual de find GNU si va a ejecutar ese command en un directory que otros puedan escribir.

Busybox find reclamos de compatibilidad -regex opción de -regex , que puede usar para eliminar files que coinciden con el patrón:

 find . -type f -regex '.*\.tmp\|.*\.core' -delete 

Desafortunadamente, excluir una list de extensiones sin la opción -not es posible en el caso general (técnicamente, hay una solución , pero no escala). Esa es la razón para include la opción -not en primer lugar. Si necesita excluir una list arbitraria de extensiones, necesitará un find que admita esta opción, o find + grep + xargs :

 find . | grep -v -e '\.jpg$' -e '\.txt$' | xargs rm