Comme le titre l'indique, j'essaye de supprimer récursivement tous les fichiers d'un dossier commençant par ._
. Pour chaque fichier sur mon site, il existe un fichier avec le même nom exact, mais avec ._
ajouté. Comment puis-je me débarrasser de ceux-ci?Comment effacer récursivement tous les fichiers d'un dossier commençant par "._"?
Répondre
Je pense que vous vouliez dire "préfixé"
EDIT PLUS TARD
script SH:
find . -name ".?*" -exec rm {} \;
Le code précédent ne fonctionnait pas récursive; celui-ci fait. Si vous voulez supprimer des dossiers aussi, utilisez ceci:
find . -name ".?*" -exec rm -R {} \;
Étant donné l'utilisation de "récursivement" dans la question, je pense que cela devrait être "-name". * "'. Aussi, à moins que votre système ne soit assez vieux et ne le supporte pas encore, '-exec rm {} +' appellera 'rm' en batch au lieu d'une fois par fichier. – Gilles
@Gilles l'a corrigé, merci –
Vous pouvez utiliser 'find. -name "._? *" -exec rm {} \; 'à la place, comme seul le point supprimera tous les fichiers commençant par". ", tels que' .git'. –
Edit: utilisateur Gilles ci-dessous correctement indique que la technique alternative suivante peut être dangereux parce que xargs ne traite pas guillemets simples et doubles dans un nom de fichier littéralement. Un fichier portant le nom Today's special.txt
entraînerait une erreur (guillemets non terminés). Je l'inclue toujours ici par souci d'exhaustivité, car il est largement mentionné sur le web.
Une autre manière similaire de faire cela sur Unix/Mac en passant par la tuyauterie à rm.
find . -name '.*' -type f | xargs rm -f
L'argument -type f
dit qu'il ne tient pas compte des répertoires et des fichiers spéciaux comme., .., liens symboliques et devs.
Nous ne pouvons malheureusement pas utiliser quelque chose comme rm -R .*
parce que le modèle d'entrée .*
est développé par le shell avant d'être donné à la commande rm. Cela entraînerait la suppression récursive de tous les fichiers correspondant à ceux du répertoire de départ.
La commande Windows équivalente (del -R .*
) est beaucoup plus simple pour l'utilisateur car le programme del
fait le travail d'élargir les wildchards pour chaque sous-répertoire.
1. L'argument de '-name' devrait être simplement' '. *' '. 2. Cela ne fonctionnera pas s'il y a un nom de fichier (y compris les répertoires principaux) contenant des espaces ou '\" '', car' xargs' traite ces caractères spécialement.Ne pas utiliser 'xargs' sauf si vous savez avec certitude que ces caractères À la place, comme dans la réponse de Gabi, utilisez plutôt '-exec', car la commande est' rm', le risque de désastre est particulièrement élevé – Gilles
Le type -f fait en sorte que les dirs y compris., .. sont ignorés.Bon point cependant sur les fichiers avec '
et "
dans leurs noms.xargs essaie de les interpréter et cela pose problème. Je mettrai à jour ma réponse avec votre mise en garde. Je pense toujours qu'il est utile d'inclure cette façon de faire les choses. Une simple recherche en montre de nombreuses mentions. –
Alkaline
double possible de this post, et je l'ai utilisé avec succès sur mon propre serveur de production:
find /var/www/html \(-name '.DS_Store' -or -name '._*' \) -delete
find . \(-name '.DS_Store' -or -name '._*' \) -type f -print0 | xargs -0 rm -f
Utilisez cette commande pour inclure des fichiers et des dossiers avec l'espace dans leurs noms dans votre recherche et .
Quel langage de programmation utilisez-vous? –