Unix no es DOS. No hay un campo especial de "extensión" en el nombre de un archivo. Cualquier carácter después de un punto es solo parte del nombre y se llama sufijo. Puede haber más de un sufijo, por ejemplo .tar.gz
. El carácter de glob de shell *
coincide con el carácter .
; es ajeno a los sufijos. Entonces, el MS-DOS *.*
es solo *
en Unix.
Casi. *
no coincide con los archivos que comienzan con .
. Los objetos nombrados con un punto inicial son, por convención, "ocultos". No aparecen en ls
a menos que especifique -a
.
(esto significa que el .
y ..
entradas de directorio para "auto" y "padre" se consideran ocultas.)
Para que coincida con las entradas ocultas También, el uso .*
El comando rm
no elimina directorios (cuando no se opera recursivamente con -r
). Pruebe rm <directory>
y vea. Incluso si el directorio está vacío, se rechazará.
Por lo tanto, la manera de quitar todos (no oculta) archivos, tuberías, dispositivos, tomas de corriente y los enlaces simbólicos a partir de un directorio (pero deje los subdirectorios solo) es, de hecho:
rm /path/to/directory/*
para eliminar también los escondidos que comienzan con .
:
rm /path/to/directory/{*,.*}
Esta sintaxis es la expansión de llaves. La expansión de la abrazadera no es coincidencia de patrones; es sólo un corto mano para generar múltiples argumentos, en este caso:
rm /path/to/directory/* /path/to/directory/.*
esta expansión tiene lugar primero primero y luego globbing tiene lugar para generar los nombres de ser eliminados.
Tenga en cuenta que varias soluciones publicados aquí tiene varios problemas:
find /path/to/directory -type f -delete
# -delete is not Unix standard; GNU find extension
# without -maxdepth 1 this will recurse over all files
# -maxdepth is also a GNU extension
# -type f finds only files; so this neglects to delete symlinks, fifos, etc.
El GNU encontrar soluciones tienen la ventaja de que funcionan incluso si el número de entradas de directorio se va a eliminar es enorme: demasiado grande para pasar de una llamada única al rm
. Otra ventaja es que el -delete
incorporado no tiene problemas para pasar nombres de rutas divertidas a un comando externo.
La solución portátil para el problema de demasiadas entradas de directorio es una lista de las entradas con ls
y el tubo de xargs
:
(cd /path/to/directory ; ls -a | xargs rm --)
Los paréntesis significan "hacer estos comandos en un sub-proceso"; de esta manera, se olvida el efecto del cd
, que es útil en la creación de scripts. ls -a
incluye los archivos ocultos.
Ahora incluimos un --
después de rm
que significa "esta es la última opción; todo lo demás es un argumento sin opción". Esto nos protege contra las entradas de directorio cuyos nombres son indistinguibles de las opciones. ¿Qué ocurre si un archivo se llama -rf
y termina en el primer argumento? Entonces tiene rm -rf ...
que explotará subdirectorios.
es encontrar la única respuesta? Me sorprende que rm no pueda manejar esto sin dar advertencias, ya que parece una operación tan simple – toop
¿Qué pasa con 'find'? Entiendo que es un poco torpe, pero es mejor mantener 'rm' simple y' find' stunky que pedir que se agreguen todas las características a 'rm' (lo cual es tan torpe como' find') – Shep