options alternatives à rm -f

10

Je voudrais exécuter une ligne de commande:

cd ~/www/tmp/; rm -P 2*

Mais j'obtiens une erreur s'il n'y a pas de fichiers commençant par 2.

On pourrait penser que je voudrais utiliser -f, cependant:

-f      Attempt to remove the files without prompting for confirmation, regardless of the file's permissions.  If the file does not exist, do not display a diagnostic message or modify the exit status to reflect an error.

Et je fais soin de fichier permissions- s'il y a quelque chose de bizarre se passe, je préfère la commande abort. Je veux seulement supprimer les erreurs «n'existe pas».

J'ai regardé d'autres questions avec des `` erreurs rm '' et trouvé ces deux qui semblent (un peu) pertinentes:

Supprimez les fichiers et les répertoires par leur nom. Aucun fichier ou répertoire de ce nom

Mais, je ne comprends pas tout ce qui se passe dans les réponses à cette question, et je ne sais pas si j'en ai besoin?

Le touchhack suggéré dans cette question:

Rm n'a-t-il pas signalé qu'un fichier est manquant?

Cela semble réalisable, car je ne pense pas que cela me dérange de la performance (mais quel type de performance souhaitez-vous prendre?

Je ne sais pas comment je ferais un if-thendans la ligne de commande.

Existe-t-il d'autres options pour un nettoyage simple en ligne de commande couper-coller?

Fonctionnerait find -deletemieux pour mon cas? Si oui, pourquoi?


erreur en question:

rm: 2*: No such file or directory
user3082
la source
1
L'erreur vient de votre shell, non rm, vous devrez donc dire ce que c'est.
Michael Homer
Utilisez-vous zshvotre shell interactif? Obtenez-vous une No matches founderreur?
Kusalananda
2
@MichaelHomer Non, l'erreur vient de rm. Le shell a simplement transmis la chaîne 2*à rm au lieu de la développer dans une liste de fichiers. Regardez l'erreur en question: il dit que rm se plaint, pas sh / bas / zsh / ...
doneal24

Réponses:

13

Pour appeler uniquement rm -Ppour existants fichiers réguliers dont le nom correspond à un modèle dans un répertoire (mais pas au- dessous):

find directory -maxdepth 1 -type f -name 'pattern' -exec rm -P {} +

Par exemple,

find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +

Pour faire correspondre uniquement les non-répertoires, utilisez ! -type dà la place de -type f. La différence est que ! -type dcela serait vrai pour une plus large gamme de types de fichiers (liens symboliques, canaux nommés, sockets, etc.)

Étant donné que vous souhaitez être invité à indiquer certaines conditions sur les fichiers trouvés, vous ne devez pas utiliser à la -deleteplace de -exec rmpuisque cela fonctionne comme rm -f.

Supprimer -maxdepth 1pour laisser findapparaître les sous-répertoires récursivement.

Kusalananda
la source
3
Bien que ! -type dpourrait être plus proche rm 2*, je pense?
muru
Donc, je devrais ajouter -P pour obtenir cette fonctionnalité?:find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +
user3082
@ user3082 Oui, j'ai oublié que vous vouliez -Paussi l' utiliser .
Kusalananda
Merci @muru, je veux vraiment -type f, mais je ne savais pas comment faire rmcomme ça - donc la suggestion de @ Kusalanada était parfaite, et la différenciation / explication est excellente pour apprendre.
user3082
@ user3082 vous devrez probablement utiliser la globalisation étendue de votre shell (par exemple, rm 2*(.)en zsh).
muru