tagger tag picard para mp3tag mac kid3 for easytag app linux ssh find rm

tag - Elimine todos los archivos que no tengan las siguientes extensiones en Linux



picard app (3)

Tengo una lista de extensiones:

avi,mkv,wmv,mp4,mp5,flv,M4V,mpeg,mov,m1v,m2v,3gp,avchd

Quiero eliminar todos los archivos sin las siguientes extensiones, así como los archivos sin extensión en un directorio en Linux.

¿Cómo puedo hacer esto usando el comando rm linux?


Con Bash, primero podría habilitar la opción extglob:

$ shopt -s extglob

Y haz lo siguiente:

$ rm -i! (*. avi | * .mkv | * .wmv | * .mp4)


Primero tendrá que encontrar archivos que no contengan esa extensión. Puedes hacer esto muy fácilmente con el comando de find . Puedes construir en el siguiente comando:

find /path/to/files ! -name "*.avi" -type f -exec rm -i {} /;

También puede usar -regex lugar de -name para alimentar en un patrón de búsqueda complejo. ! Es negar la búsqueda. Por lo tanto, enumera efectivamente aquellos archivos que no contienen esas extensiones.

Es bueno hacer rm -i ya que enumera todos los archivos antes de eliminarlos. Puede ser tedioso si su lista es exhaustiva, por lo que puede decidir incluirla o no.

Eliminar toneladas de archivos usando esto puede ser peligroso . Una vez eliminado, nunca podrá recuperarlos. Así que asegúrese de ejecutar el comando de find sin el rm primero para inspeccionar la lista antes de eliminarlos.

Actualizar:

Como se indica en los comentarios de aculich , también puede hacer lo siguiente:

find /path/to/files ! -name "*.avi" -type f -delete

-type f se asegurará de que solo find y delete archivos normales y no toque ningún directorio, enlace de símbolos, etc.


Puede usar un comando rm rápido y sucio para lograr lo que desea, pero tenga en cuenta que es propenso a errores, no portátil, peligroso y tiene limitaciones graves .

Como otros han sugerido, puede usar el comando find . Recomendaría usar find lugar de rm en casi todos los casos.

Como mencionas que estás en un sistema Linux, usaré la implementación GNU que forma parte del paquete findutils en mis ejemplos porque es la opción predeterminada en la mayoría de los sistemas Linux y es lo que generalmente recomiendo aprender, ya que es mucho más rico y más Conjunto avanzado de características que muchas otras implementaciones.

Aunque puede ser desalentador y aparentemente demasiado complicado , vale la pena dedicar tiempo a dominar el comando de find porque le brinda un tipo de expresividad y seguridad precisas que no encontrará con la mayoría de los otros métodos sin volver a inventar esto esencialmente. ¡mando!

Encontrar ejemplo

La gente a menudo sugiere usar el comando de find maneras ineficientes, propensas a errores y peligrosas , por lo que a continuación describo una manera segura y efectiva de lograr exactamente lo que pidió en su ejemplo.

Antes de eliminar archivos, recomiendo obtener una vista previa de la lista de archivos primero (o al menos parte de la lista si es muy larga):

find path/to/files -type f -regextype posix-extended -iregex ''.*/.(avi|mkv|wmv|mp4|mp5|flv|M4V|mpeg|mov|m1v|m2v|3gp|avchd)$''

El comando anterior le mostrará la lista de archivos que va a eliminar. Para eliminar realmente los archivos, simplemente puede agregar la acción -delete así:

find path/to/files -type f -regextype posix-extended -iregex ''.*/.(avi|mkv|wmv|mp4|mp5|flv|M4V|mpeg|mov|m1v|m2v|3gp|avchd)$'' -delete

Si desea ver lo que quedará, puede invertir las coincidencias en la vista previa agregando ! para el comando de vista previa ( sin el -delete ) así:

find path/to/files -type f -regextype posix-extended ! -iregex ''.*/.(avi|mkv|wmv|mp4|mp5|flv|M4V|mpeg|mov|m1v|m2v|3gp|avchd)$''

La salida de esta coincidencia inversa debe ser la misma que la que verá al enumerar los archivos después de realizar la eliminación, a menos que se hayan producido errores debido a problemas de permisos o sistemas de archivos no grabables:

find path/to/files -type f

Explicación

Aquí explicaré con mayor profundidad las opciones que elegí y por qué:

-type f para restringir las coincidencias solo a archivos ; sin eso, coincidirá con archivos que no son archivos, como los directorios que probablemente no desee. También tenga en cuenta que lo puse al principio y no al final porque el orden de los predicados puede ser importante para la velocidad; con -type f primero ejecutará la expresión regular en archivos solo en lugar de en todo ... en la práctica, puede que no importe mucho a menos que tenga muchos directorios o no archivos. Sin embargo, vale la pena tener en cuenta el orden de los predicados, ya que puede tener un impacto significativo en algunos casos.

Utilizo la opción -iregex distinción -iregex mayúsculas y minúsculas en -iregex opción -iregex distingue -iregex mayúsculas y minúsculas porque asumí que quería usar la coincidencia que distingue entre mayúsculas y minúsculas por lo que incluirá archivos .wmv y .WMV .

Probablemente querrá usar expresiones regulares POSIX para simplificar y abreviar. Desafortunadamente, todavía no hay una mano corta para -regextype posix-extended , pero aún así recomendaría su uso porque puede evitar el problema de tener que agregar muchas barras invertidas para escapar de cosas en expresiones regulares más largas y complejas. Funciones más avanzadas (modernas). La implementación de GNU por defecto a expresiones regulares de estilo emacs que pueden ser confusas si no estás acostumbrado a ellas.

La opción -delete debería tener un sentido obvio, sin embargo, a veces la gente sugiere usar el -exec rm {} /; más lento y complejo -exec rm {} /; opción, pero generalmente es porque no están conscientes de la opción más segura, más rápida y más fácil de -delete (y en casos raros puede encontrar sistemas antiguos con una versión antigua de find que no tiene esta opción). Es útil saber que -exec existe, pero use -delete donde pueda para eliminar archivos. Además, no tubo | la salida de find a otro programa a menos que use y comprenda la opción -print0 , de lo contrario, se encontrará con un mundo de problemas cuando encuentre archivos con espacios.

El argumento path/to/files que incluí explícitamente. Si lo dejas fuera se usará implícitamente . como la ruta, sin embargo, es más seguro (especialmente con un -delete ) para establecer la ruta explícitamente.

Implementaciones alternativas de búsqueda

¡Aunque dijiste que estás en un sistema Linux, también mencionaré las diferencias que encontrarás con las implementaciones BSD que incluyen Mac OS X ! Para otros sistemas (como cajas Solaris más antiguas), ¡buena suerte! ¡Actualiza a una de las variantes de find más modernas!

La principal diferencia en este ejemplo es con respecto a las expresiones regulares. Las variantes BSD utilizan expresiones regulares básicas POSIX de forma predeterminada. Para evitar el escape adicional oneroso en las expresiones regulares requeridas para Basic-PRE, puede aprovechar las características más modernas de extended-PRE especificando la opción -E con la variante BSD para lograr el mismo comportamiento que la variante GNU que usa -regextype posix-extended .

find -E path/to/files -iregex ''.*/.(avi|mkv|wmv|mp4|mp5|flv|M4V|mpeg|mov|m1v|m2v|3gp|avchd)$'' -type f

Tenga en cuenta, en este caso, que la opción -E aparece antes de la path/to/files mientras que la -regextype posix-extended para GNU viene después de la ruta.

Es una lástima que GNU aún no ofrezca una opción -E (¡aún!); ya que creo que sería una opción útil tener paridad con las variantes de BSD, enviaré un parche a findutils para agregar esta opción y, si se acepta, actualizaré esta respuesta en consecuencia.

rm - No recomendado

Aunque recomiendo encarecidamente el uso de rm , daré ejemplos de cómo lograr más o menos lo que su pregunta se hizo específicamente (con algunas advertencias).

Suponiendo que use un shell con la sintaxis de Bourne (que generalmente es lo que encuentra en el sistema Linux que está predeterminado para el shell Bash), puede usar este comando:

for ext in avi mkv wmv mp4 mp5 flv M4V mpeg mov m1v m2v 3gp avchd; do rm -f path/to/files/*.$ext; done

Si usa Bash y tiene activada la función de globo extendido con shopt -s extglob , puede usar la concordancia de patrones con la expansión de nombre de archivo :

rm -f path/to/files/*.+(avi|mkv|wmv|mp4|mp5|flv|M4V|mpeg|mov|m1v|m2v|3gp|avchd)

La sintaxis de globo extendido +(pattern-list) coincidirá con una o más apariciones de los patrones dados.

Sin embargo, recomiendo encarecidamente no usar rm porque:

Es propenso a errores y es peligroso porque es fácil poner un espacio entre los * , lo que significa que borrará todo ; no puede previsualizar el resultado del comando antes de tiempo; es fuego y olvido , así que buena suerte con las consecuencias.

No es portátil porque incluso si funciona en su shell particular, la misma línea de comando puede no funcionar en otros shells (incluyendo otras variantes de Bourne-shell si es propenso a usar Bash-isms).

Tiene limitaciones graves porque si tiene archivos anidados en subdirectorios o simplemente muchos archivos en un solo directorio, rápidamente alcanzará los límites en la longitud de la línea de comando cuando use el archivo de archivos.

Desearía que el comando rm simplemente se fuera al olvido porque puedo pensar en algunos lugares donde prefiero usar rm lugar de (incluso las implementaciones antiguas de) find .