script - renombrar varios archivos linux
¿Cómo eliminar múltiples archivos a la vez en Bash on Linux? (7)
Bash admite todo tipo de comodines y expansiones.
Su caso exacto se manejaría mediante la expansión de llaves , como sigue:
$ rm -rf abc.log.2012-03-{14,27,28}
Lo anterior se expandiría a un solo comando con los tres argumentos, y sería equivalente a escribir:
$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28
Es importante tener en cuenta que esta expansión la realiza el shell, incluso antes de que rm
se cargue.
Tengo esta lista de archivos dentro del servidor Linux:
abc.log.2012-03-14
abc.log.2012-03-27
abc.log.2012-03-28
abc.log.2012-03-29
abc.log.2012-03-30
abc.log.2012-04-02
abc.log.2012-04-04
abc.log.2012-04-05
abc.log.2012-04-09
abc.log.2012-04-10
He estado eliminando los archivos de registro seleccionados uno por uno, usando el comando rm -rf
ver a continuación:
rm -rf abc.log.2012-03-14
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28
¿Hay alguna otra manera para poder eliminar los archivos seleccionados a la vez?
No soy un gurú de Linux, pero creo que quieres canalizar tu lista de archivos de salida a xargs rm -rf
. He usado algo así en el pasado con buenos resultados. Pruebe en un directorio de muestra primero!
EDITAR - Podría haber malentendido, basado en las otras respuestas que están apareciendo. Si puedes usar comodines, genial. Asumí que tu lista original que mostrabas fue generada por un programa para darte tu "selección", así que pensé que conectar con xargs
sería el camino a seguir.
Si desea eliminar todos los archivos cuyos nombres coincidan con un formulario particular, un comodín (patrón global) es la solución más directa. Algunos ejemplos:
$ rm -f abc.log.* # Remove them all
$ rm -f abc.log.2012* # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]* # Remove all files from the first quarter of 2012
Las expresiones regulares son más poderosas que los comodines; puede alimentar la salida de grep
a rm -f
. Por ejemplo, si algunos de los nombres de archivo comienzan con "abc.log"
y algunos con "ABC.log"
, grep
permite hacer una coincidencia insensible a mayúsculas y minúsculas:
$ rm -f $(ls | grep -i ''^abc/.log/.'')
Cuando hago esto, ejecuto el ls | grep ...
ls | grep ...
ordene primero y compruebe que produce la salida que quiero, especialmente si estoy usando rm -f
:
$ ls | grep -i ''^abc/.log/.''
(check that the list is correct)
$ rm -f $(!!)
donde !!
se expande al comando anterior. O puedo escribir flecha arriba o Ctrl-P y editar la línea anterior para agregar el comando rm -f
.
Esto supone que estás usando el shell bash. Algunas otras shells, particularmente csh y tcsh y algunas shells antiguas derivadas de sh, pueden no ser compatibles con la sintaxis $(...)
. Puede usar la sintaxis de retroceso equivalente:
$ rm -f `ls | grep -i ''^abc/.log/.''`
La sintaxis $(...)
es más fácil de leer, y si eres realmente ambicioso, puede anidarse.
Finalmente, si el subconjunto de archivos que desea eliminar no puede expresarse fácilmente con una expresión regular, un truco que suelo usar es hacer una lista de los archivos en un archivo de texto temporal y luego editarlo:
$ ls > list
$ vi list # Use your favorite text editor
Luego puedo editar el archivo de list
manualmente, dejando solo los archivos que deseo eliminar, y luego:
$ rm -f $(<list)
o
$ rm -f `cat list`
(Esto supone que ninguno de los nombres de archivo contiene caracteres divertidos, particularmente espacios).
O bien, al editar el archivo de list
, puedo agregar rm -f
al comienzo de cada línea y luego:
$ . ./list
o
$ source ./list
Simplemente use la selección de líneas múltiples en sublime para combinar todos los archivos en una sola línea y agregue un espacio entre cada nombre de archivo y luego agregue rm
al principio de la lista. Esto es principalmente útil cuando no hay un patrón en los nombres de archivo que desea eliminar.
[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10
Un comodín funcionaría muy bien para esto, aunque para estar seguro, lo mejor sería hacer el uso del comodín lo más mínimo posible, por lo que hay algo parecido a esto:
rm -rf abc.log.2012-*
Aunque por lo que parece, ¿son esos solo archivos individuales? La opción recursiva no debería ser necesaria si ninguno de esos elementos son directorios, por lo que es mejor no usar eso, solo por seguridad.
Use un comodín ( *
) para unir múltiples archivos.
Por ejemplo, el siguiente comando eliminará todos los archivos abc.log.2012-03-
nombres comiencen con abc.log.2012-03-
.
rm -f abc.log.2012-03-*
Recomiendo ejecutar ls abc.log.2012-03-*
para enumerar los archivos para que pueda ver lo que va a eliminar antes de ejecutar el comando rm
.
Para obtener más detalles, consulte la página de manual de Bash sobre la expansión del nombre de archivo .
si desea eliminar todos los archivos que pertenecen a un directorio a la vez. Por ejemplo; El nombre del directorio es "log" y el directorio "log" incluye los archivos abc.log.2012-03-14, abc.log.2012-03-15, ..... ect. Tienes que estar por encima del directorio de registro y
rm -rf / log / *