2009-05-13 13 views
7

Tengo un directorio src/que contiene muchos archivos .cc y su código binario. Por ejemplo:Cómo eliminar/eliminar archivos ejecutables (también conocidos como archivos sin extensión) solo

src/ 
    |_ foo.cc 
    |_ bar.cc 
    |_ qux.cc 
    |_ thehead.hh 
    |_ foo (executable/binary) 
    |_ bar (executable/binary) 
    |_ qux (executable/binary) 
    |_ makefile 

En realidad hay muchas .cc y archivos ejecutables.

Necesito eliminar esos binarios de forma global sin tener que listar todos los archivos. ¿Hay una manera rápida y compacta de hacerlo?

me trataron:

$ rm * 

pero elimina todos los archivos incluyen archivos .cc y .hh.

Sé de la existencia de este comando:

$ rm foo bar qux .... 

pero todavía tenemos que enumerar todos los archivos uno por uno.

Respuesta

16

puede ejecutar

find . -perm +100 -type f -delete 
+3

Solo por cuestión de claridad, esto solo verifica si el bit de ejecución del usuario está configurado y está usando sintaxis en desuso. Vea al hombre encontrar los detalles sangrientos. –

16

Aquí van:

ls | grep -v "\." | xargs rm 

El grep -v dice "sólo permiten nombres de archivo que no contienen un punto", y la xargs rm dice "entonces pasa una lista de nombres de ficheros a rm".

+4

@Richie: gracias. ¿Hay alguna manera de excluir "makefile"? Que queremos mantener – neversaint

+3

@foolishbrat: simplemente agregue otro grep: ls | grep -v "\" | grep -v makefile | xargs rm – RichieHindle

+0

¿Qué tal si se excluyen los subdirectorios? Supongo que necesitas usar 'find' en lugar de' ls' para eso? también, puede excluir archivos con '.' y' Makefile' con un 'grep' como ese:' ls | grep -v "\. \ | Makefile" ' – sixty4bit

8

Utilice find. Lo que se quiere es la siguiente:

find . -type f -executable -exec rm '{}' \; 

eliminación de todo, sin una extensión también se puede hacer:

La primera opción no elimina el Makefile, y por lo tanto debe preferirse. Creo kcwu's answer muestra una buena manera de mejorar la anterior utilizando la opción -delete:

find . -type f -executable -delete 
find . -type f -not -iname "*.*" -delete 

Editar: Consumo findutils find, versión 4.4.0, bajo Ubuntu 8.10. No sabía que el interruptor -executable es tan poco común.

+0

@Stephan: Obtuve "find: -executable: unknown option" – neversaint

+0

¿Qué hallazgo estás usando? -executable no funciona para mí. Sin embargo, puedo usar -perm/ugo + x con GNU find. –

+0

@foolishbrat: quizás estés usando una opción más antigua de buscar. Prueba la respuesta de kcwu. – Stephan202

2

En lugar de pasar -exec rm '{}' \; para encontrar uno puede usar -delete arg.

2

Uso encontrar para eliminar todos los archivos (no las carpetas) que no contienen un punto characeter:

find . \! -name "*.*" -type f -exec rm {} \; 
+0

ausencia de. no significa que es ejecutable –

3
find . -perm /ugo+x -delete 

versión corregida del primer comando de Stephan202.

EDIT: Proveedores:

find . -perm /111 -delete 

que utiliza el equivalente octal

+0

@Matt: bajo MacOsX, obtengo esto: find: -perm:/ugo + x: cadena de modo ilegal – neversaint

+0

Pruebe la versión octal. –

2

sugiere emplear primera

find . -not -name "*.*" -exec ls -l {} \; 

para ver el nombre de los archivos que coinciden.

y luego, cambiar las ls -l a rm

find . -not -name "*.*" -exec rm {} \; 

También, se puede utilizar un indicador de confirmación para que sea más segura:

find . -not -name "*.*" -exec rm -i {} \; 
5

yo preferiría ir a dar un limpia objetivo en el archivo MAKE. Lo más probable es que ya contenga una lista de estos binarios, por lo que agregar un objetivo limpio no requeriría demasiado esfuerzo.

+0

Y es más seguro. Solo piense en lo que sucede si utiliza una de las otras soluciones grep'ish y alguien decide que sería una buena idea tener un archivo "README" ;-) – lothar

+1

¿Cómo escribiría el objetivo 'make clean' para eliminar todo los ejecutables compilados? Pensé que ese era el punto del 'find' y' ls | grep' tipo de respuestas, para poner bajo 'clean:' y atrapar todos los ejecutables? ¿O estoy perdiendo un punto en algún lado? – Harry

+0

Los archivos Make están formados por instrucciones estáticas que describen un mapa cuyos archivos de origen se utilizan para generar un archivo de destino específico y cómo. Por lo tanto, generalmente tiene una lista de todos los posibles ejecutables de destino en una variable llamada TARGETS o similar. – raimue

Cuestiones relacionadas