¿Cómo puedo eliminar todos los archivos con una extensión particular en una carpeta particular?

36

Si configuro el directorio actual / de trabajo (navegando hacia él usando cd) en algún directorio particular y luego escribo:

rm *.xvg

¿Qué hará este comando? ¿Es cierto que el comando anterior solo eliminará archivos con la extensión .xvg solo en el directorio de trabajo?

Estaba nervioso por intentar esto antes de preguntar, porque quiero estar absolutamente seguro de que el comando anterior solo eliminará los .xvgarchivos UBICADOS EN EL DIRECTORIO DE TRABAJO .

Andrés
fuente

Respuestas:

34

Sí, rm *.xvgserá solamente eliminar los archivos con la extensión especificada en su actual directorio.

Una buena manera de asegurarse de que realmente está en el directorio que desea eliminar sus archivos es usar el pwdcomando que mostrará su directorio actual y luego hacer una lsverificación para verificar que encuentre los archivos que está esperando.

Si tiene un poco de aprensión al emitir el rmcomando, hay dos cosas que puede hacer:

  1. escriba ls *.xvgpara ver una lista de qué archivos se verían afectados por este comando.

  2. A menos que tenga muchos archivos, siempre puede usar el -iinterruptor de línea de comando para rm(también existe para cpy mv). El uso rm -i *.xvgle solicitará cada archivo individual si está bien eliminarlo, por lo que puede estar seguro de que nada de lo que no esperaba se eliminaría. (Esto será tedioso si tienes muchos archivos :)

Levon
fuente
1
Además: rm -f {*.xvg,.*.xvg}para eliminar también los archivos ocultos. Y rm -R -f {*.xvg,.*.xvg}para eliminar también directorios.
Dor
20

No necesita navegar al directorio, solo use

rm /some/dir/*.xvg 

En el caso de que tenga un error tipográfico o similar en la ruta, donde / som / dir no existe:

cd /som/dir
rm *.xvg

borrará accidentalmente todos los archivos .xvg en el directorio actual. El primer comando no lo hará, y no necesita volver a cd.

Una forma alternativa sería usar find:

find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete 
usuario desconocido
fuente
find / some / dir / -maxdepth 1 -type f -name "* .xvg" -delete ¡funcionó para mí! use -maxdepth "n" para eliminar archivos coincidentes en el subdirectorio si se le da la ruta
Vinay
3

Sí, rm *.xvgsolo eliminará los archivos que terminan .xvgen su directorio actual. Este es el por qué.

Cuando escribe un comando como este, el trabajo se divide entre el shell que está utilizando (supongamos que bash) y el comando binario.

Puede localizar el binario escribiendo which rm. Este pequeño programa se encarga de desvincular archivos. Programas como este se pueden iniciar desde la línea de comandos y pueden leer una lista de argumentos prog arg1 arg2 arg3cuando se inician. En el caso de rm, se interpretan como una lista de nombres de archivos totalmente calificados para ser eliminados. Entonces, si está en un directorio que contiene el archivo foo.bar, escribir delete 'foo.*'resultará enrm: foo.*: No such file or directory . Tenga en cuenta las comillas simples alrededor del patrón del archivo, le dicen al shell que pase el argumento al shell tal como está.

Sin embargo, si escribe rm *.baren el mismo directorio, eliminará el archivo. Lo que sucede aquí es que su shell, que es el programa que está utilizando para escribir comandos, está realizando algunas transformaciones antes de pasar los argumentos al comando. Uno de ellos se llama 'expansión de nombre de archivo', también conocido como 'globbing'. Puede ver una lista de expansiones de nombre de archivo bash aquí . Una de las expansiones más comunes es *, que se expande a nombres de archivo en el directorio actual.

Una forma simple de ver los globos en el trabajo es usar echo, que imprime todos los argumentos que se le pasan a través del shell. Entonces escribir echo *en el mismo directorio dará como resultado foo.bar. Entonces, cuando escribe rm *.bar, lo que realmente está sucediendo es que el shell expande la lista de argumentos y foo.barluego lo pasa al rmcomando.

Hay algunas formas de controlar el globbing. En versiones recientes de bash, por ejemplo, puede activar una opción llamada globstar que hará una expansión recursiva. Al escribir echo **/*.barse mostrará una lista de todos los archivos que terminan .baren todas las subcarpetas. Por lo tanto, escribir rm **/*.baren bash habilitado con globstar eliminará de forma recursiva todos los archivos coincidentes en las subcarpetas.

Purzelrakete
fuente
1

Comando:

  rm ./*.pgm

funciona para mi

Mando:

rm *.pgm

da un comando de error (en polaco, traducido):

rm: wrong option - '1'
Use "rm ./-1000.pgm" to delete the file '-1000.pgm'.
Write "rm --help" for information.

en

bash --version
GNU bash, wersja 4.4.19(1)-release (x86_64-pc-linux-gnu)
Adán
fuente