web-dev-qa-db-fra.com

rm -rf tous les fichiers et tous les fichiers cachés sans. & .. Erreur

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 ..?

90
Jake Wilson

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.

41
evilsoup

* 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

-A = tout lister sauf. et ..

-1 = mettre chaque article sur une seule ligne

22
godzillante

Modifiez l'option dotglob de votre Shell et utilisez *, ou utilisez quelque chose comme find.

find somedir -mindepth 1 -delete
16

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
5
Paweł Prażak

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.

3
Kusalananda

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.

3
laebshade

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:

2
will

Tu peux essayer

rm -rf /some/path/*.*
0
Saroj