2012-05-10 26 views

Respuesta

5

El comando ls -l dio una lista de todos los subdirectorios en su actual directorio de trabajo actual (PWD).

El comando rm puede eliminar varios archivos/directorios si los pasa como una lista.

por ejemplo: rm test1.txt test2.txt myApp se eliminarán todos los tres de los archivos con los nombres de:

test1.txt 
test2.txt 
myApp 

Además, las banderas para el comando que utilizó rm son comunes en muchos una locura.
rm -f - Fuerza la eliminación de archivos sin preguntar o confirmar
rm -r - Recursividad en todos los subdirectorios y borrar todo su contenido y subdirectorios

Por lo tanto, digamos que está en/home/usuario, y la estructura de directorios parece por lo que:

/home/user 
|->dir1 
|->dir2 
`->file1.txt 

el comando ls -l proporcionará la lista que contiene "dir1 dir2 file1.txt", y el resultado del comando ls -l | xargs rm -rf se verá así:
rm -rf dir1 dir2 file1.txt

Si ampliamos su pregunta original con el ejemplo anterior, la orden final que se pasa al sistema se convierte en: rm -rf di1 dir2 file1.txt bark.*

Así, todo en el directorio actual se aniquilado, por lo que el bark.* es redundante (de hecho le dijo a la máquina que destruyera todo en el directorio actual de todos modos).

creo que lo que quería hacer era eliminar todos los archivos en el directorio actual y todos los subdirectorios (recurse) que comienzan con bark. Para ello, sólo hay que hacer:
find -iname bark.* | xargs rm

El comando anterior medios "busque todos los archivos en este directorio y subdirectorios, ignorando MAYÚSCULAS/minúsculas/mIxEdCaSe, que comienzan con los caracteres" ladrar "y elimínelos". Esto podría ser un mal comando si tiene un error tipográfico, por lo tanto, para estar seguro, siempre debe probar antes de realizar una eliminación de lote como esta.

En el futuro, primero haga lo siguiente para obtener una lista de todos los archivos que va a eliminar primero para confirmar que son los que desea eliminar.
find -iname bark.* | xargs echo

Entonces si está seguro, eliminarlos a través de
find -iname bark.* | xargs rm

Espero que esto ayude.

Como nota humorística, uno de los más famosos casos de "rm-rf" se puede encontrar aquí: https://github.com/MrMEEE/bumblebee-Old-and-abbandoned/commit/a047be85247755cdbe0acce6f1dafc8beb84f2ac

un script automatizado funciona algo así como rm -rf /usr/local/........., pero debido a la inserción accidental de un espacio, el comando se convirtió en rm -rf /usr /local/......, por lo que esto significa "eliminar todas las carpetas de raíz que comienzan con usr o local", destruyendo efectivamente el sistema de cualquiera que lo use.Me siento mal por ese desarrollador.

Puede evitar este tipo de errores citando sus cadenas, es decir: rm -rf "/usr/ local/...." habría proporcionado un mensaje de error y evitar este error, debido a que las cotizaciones significan que todo entre ellos es la ruta completa, no una lista de trayectorias separadas/files (es decir: le está diciendo a rm que el archivo/carpeta tiene un carácter SPACE en su nombre).

10

El argumento -r significa "eliminar recursivamente" (es decir, descender a los subdirectorios). El comando -f significa "fuerza" (en otras palabras, no solicite confirmación). -rf significa "descender recursivamente en subdirectorios sin pedir confirmación"

ls -l enumera todos los archivos en el directorio. xargs toma la entrada de ls -l y lo anexa al comando que se pasa a xargs

El último comando que quedó ejecutado veía así:

rm -rf bark.* <output of ls -l> 

Esto esencialmente elimina bark.*y todos los archivos en el directorio actual . Moraleja de la historia: tenga mucho cuidado con rm -rf. (Puede usar rm -ri para preguntar antes de borrar archivos en su lugar)

6

rm(1) borró todos los archivos y directorios en el directorio de trabajo actual porque usted así lo solicitó.

Para ver más o menos lo que pasó, ejecute lo siguiente:

cd /etc ; ls -l | xargs echo 

prestar especial atención a la salida.

Recomiendo usar echo en lugar de rm -rf al construir líneas de comando. Solo si el resultado se ve bien, debe volver a ejecutar el comando con rm -rf. En caso de duda, tal vez solo use rm -r para que no se escape demasiado accidentalmente. rm -ir si usted es muy escéptico de su línea de comando. (He estado usando Linux desde 1994 y que todavía uso este truco echo en la construcción de líneas de comandos poco complicados para eliminar selectivamente una pila de archivos.)

Por cierto, me gustaría evitar que sea interpretado ls(1) salida de cualquier manera - los nombres de archivo puede contener cualquier carácter, excepto ASCII NUL y / caracteres, incluidas líneas nuevas, pestañas y resultados que parece como ls -l salida. Tratando de parse esto con herramientas como xargs(1) puede ser peligroso.

En su lugar, use find(1) para este tipo de cosas. Para eliminar todos los archivos en todos los directorios llamados bark.*, me gustaría correr un comando como este:

find . -type d -name 'bark.*' -print0 | xargs -0 rm -r 

Una vez más, me gustaría usar echo en lugar de rm -r para la primera ejecución - y si se veía bien, a continuación, Me volvería a ejecutar con rm -r.

+0

De vez en cuando me encuentro en sistemas sin 'encontrar -print0' y el emparejado' xargs -0'. Muy muy molesto Creo que Solaris puede ser uno de esos cretin lisiados. – tchrist

Cuestiones relacionadas