rm -rf /some/path/*
supprime tous les fichiers non cachés dans ce répertoire (et ses sous-répertoires).
rm -rf /some/path/.*
supprime tous les fichiers cachés dans ce répertoire (mais pas les sous-répertoires) et donne également l'erreur/avertissement suivant:
rm: cannot remove directory: `/some/dir/.'
rm: cannot remove directory: `/some/dir/..'
Quelle est la bonne façon de supprimer récursivement tous les fichiers et dossiers cachés et non cachés dans un répertoire cible sans recevoir l'avertissement/l'erreur sur .
et ..
?
Vous pouvez toujours envoyer des messages d'erreur à /dev/null
rm -rf /some/path/.* 2> /dev/null
Vous pouvez également
rm -rf /some/path/
mkdir /some/path/
... alors vous n'aurez pas à vous soucier des fichiers cachés en premier lieu.
*
correspond à tous les fichiers autres que des points, .[!.]*
correspond à tous les fichiers de points sauf .
et les fichiers dont le nom commence par ..
, et ..?*
correspond à tous les fichiers point à point sauf ..
. Ensemble, ils correspondent à tous les fichiers autres que .
et ..
. Si l'un de ces trois motifs ne correspond à rien, il se développe à lui-même; rm -f
ne se soucie pas d'arguments inexistants, donc cela n'a pas d'importance.
rm -rf ..?* .[!.]* *
Vous pouvez également utiliser find
. C'est plus complexe mais a l'avantage de fonctionner même s'il y a tellement de fichiers que les caractères génériques ci-dessus s'étendent au-delà de la limite de longueur de ligne de commande de votre système.
find . -name . -o -Prune -exec rm -rf -- {} +
Vous pouvez trouver plus clair de supprimer et de recréer le répertoire. Cela présente l'avantage (ou l'inconvénient, selon le cas) de générer un répertoire vide même si un autre programme crée simultanément des fichiers dans le répertoire d'origine.
Je viens de réaliser que c'est le moyen le plus pratique dans la plupart des distributions Linux:
ls -A1 | xargs rm -rf
où
-A
= tout lister sauf.
et ..
-1
= mettre chaque article sur une seule ligne
Modifiez l'option dotglob
de votre Shell et utilisez *
, ou utilisez quelque chose comme find
.
find somedir -mindepth 1 -delete
Cela devrait fonctionner comme la réponse @Gilles mais plus compact:
rm -rf {,.[!.],..?}*
ou
rm -rf dir/to/files/{,.[!.],..?}*
devrait également ajouter un if
pour une utilisation dans les scripts juste pour être sûr:
if [ -d "$DIR" ]; then
rm -rf ${DIR}/{,.[!.],..?}*
fi
Quelle est la bonne façon de supprimer récursivement tous les fichiers et dossiers cachés et non cachés dans un répertoire cible sans recevoir l'avertissement/l'erreur sur. et ..?
En supposant que le répertoire en question est ./dir
, puis
rm -rf ./dir
supprimerait tous les fichiers de ./dir
, y compris les fichiers et répertoires cachés, récursivement, et incluant le ./dir
répertoire lui-même.
Si vous ne souhaitez pas supprimer le répertoire lui-même, vous pouvez simplement le recréer ensuite ou utiliser
find ./dir -mindepth 1 -delete
ou si vous find
ne prend pas en charge -delete
,
find ./dir -mindepth 1 -depth -exec rm -rf {} ';'
En utilisant -mindepth 1
vous permet de conserver le répertoire de niveau supérieur ./dir
.
Trouvez est votre ami.
find ! -name '.' ! -name '..' -delete
% find ! -name '.' ! -name '..'
./test
./test4
./test4/.test6
./test3
./.test5
./test2
% find ! -name '.' ! -name '..' -delete
% find ! -name '.' ! -name '..'
%
Si vous souhaitez utiliser une recherche récursive dans un autre répertoire de votre répertoire actuel ($ PWD), ajoutez un chemin juste après la commande find
; par exemple., find /path ! -name '.' ! -name '..' -delete
. Si vous souhaitez uniquement descendre n
nombre de répertoires, utilisez le -maxdepth n
option juste après le /path
paramètre.
La commande ci-dessus a été testée sur un système Ubuntu 13.04. Fonctionnera probablement sur d'autres systèmes Linux modernes.
Je vous suggère d'expérimenter avec
Activez - [~ # ~] sur [~ # ~] points (fichiers cachés)
définir dotglob
shopt -s dotglob
Désactivez - [~ # ~] [~ # ~] points
unset dotglob
shopt -u dotglob
Cette méthode fonctionnait exactement comme je souhaité pour une commande copier qui manquait les répertoires cachés.
shopt -s dotglob
cp -rvn ./$from/* ./$too/
shopt -u dotglob
J'ai donc fait une suppression (suppression), et oups ...
shopt -s dotglob
rm -fr ../message_splitter--044a/*
shopt -u dotglob
... ça marche aussi !
Il me vient à l'esprit que vous cher lecteur ne peut pas voir le message_splitter
répertoire. De toute façon, il a un .svn
dossier qui doit être supprimé et copié dans.
Depuis la page man
...
dotglob
S'il est défini, bash inclut les noms de fichiers commençant par un `. ' dans les résultats de l'expansion du nom de chemin.
références:
Tu peux essayer
rm -rf /some/path/*.*