la commande rechercher dans le script bash qui a entraîné une “Aucun fichier ou répertoire” erreur uniquement pour les répertoires?

Mise à JOUR 2014-03-21

Donc, j'ai réalisé que je n'étais pas aussi efficace que je pourrais être, comme tous les disques que j'avais besoin de "frotter" étaient sous /media et nommé "disk1, disk2,disk3, etc." Voici le script final:

DIRTY_DIR="/media/disk*" 
find $DIRTY_DIR -depth -type d -name .AppleDouble -exec rm -rf {} \;
find $DIRTY_DIR -depth -type d -name .AppleDB -exec rm -rf {} \;
find $DIRTY_DIR -depth -type d -name .AppleDesktop -exec rm -rf {} \;
find $DIRTY_DIR -type f -name ".*DS_Store" -exec rm -f {} \;
find $DIRTY_DIR -type f -name ".Thumbs.db" -exec rm -f {} \; #  I know, I know, this is a Windows file.

Prochaine sera probablement juste pour nettoyer le code encore plus, et d'ajouter des fonctionnalités telles que la connexion et la communication des résultats (par e-mail ou autre); à l'exclusion de système et de répertoires; et en permettant aux gens de personnaliser la liste des fichiers/répertoires.

Merci pour toute l'aide!

Mise à JOUR

Avant que j'ai intégré les suggestions utiles fournis par tout le monde, j'ai effectué quelques tests, dont les résultats ont été très intéressants (voir ci-dessous).

Comme un test, j'ai exécuté cette commande:

root@doi:~# find /media/disk3 -type d -name .AppleDouble -exec echo rm -rf {} \;

Les résultats (qui est ce que j'attendais):

rm -rf /media/disk3/Videos/Chorus/.AppleDouble

Cependant, lorsque j'ai exécuté la commande réelle (sans echo):

root@doi:~# find /media/disk3 -type d -name .AppleDouble -exec rm -rf {} \;

J'ai reçu la même "erreur" de sortie:

find: `/media/disk3/Videos/Chorus/.AppleDouble': No such file or directory

J'ai mis "erreur" entre guillemets parce que, évidemment, le dossier a été supprimé, comme l'a vérifié en lançant:

root@doi:~# find /media/disk3 -type d -name .AppleDouble -exec rm -rf {} \;
root@doi:~# 

Il semble que la find commande conservé l'original des résultats, a agi sur elle par la suppression de l'annuaire, mais a ensuite essayé de le supprimer à nouveau? Ou est le -f option de rm, qui est censé être pour ignorer les fichiers inexistants et les arguments, est ignoré? Je remarque que quand je lance des tests avec le rm commande seul, sans le find commande, tout a fonctionné comme prévu. Ainsi, exécutant directement rm -rf ... \nonexistent_directory, aucune erreur n'a été retournée, même si la "non_existent_directory" n'était pas là, et exécute directement rm -r \nonexistent_directory fourni attendus:

rm: cannot remove 'non_existent_directory': No such file or directory

Dois-je utiliser le -delete option au lieu de la -exec rm ... option? J'avais voulu le faire le script d'une manière aussi large que possible pour les systèmes qui n'ont pas -delete option pour find.

Enfin, je n'ai pas présumer que c'questions si /media/disk1, /media/disk2, ... sont combinés en un AUFS système de fichiers sous /media/storage comme le find commande fonctionne sur les disques eux-mêmes?
Merci pour toute l'aide jusqu'à présent, les gars. Je vais publier le script quand je suis fait.

POST ORIGINAL

Je suis en train d'écrire un script bash pour supprimer quelques OS X restes sur mon Lubuntu partages de fichiers. Cependant, lors de l'exécution de cette:

...
BASE_DIR="/media/disk" # I have 4 disks: disk1, disk2, ...   
COUNTER=1

while [ $COUNTER -lt 5 ]; do      # Iterate through disk1, disk2, ...
   DIRTY_DIR=${BASE_DIR}$COUNTER     # Look under the current disk counter /media/disk1, /media/disk2, ...
   find $DIRTY_DIR -name \.AppleDouble -exec rm -rf {} \;    # Delete all .AppleDouble directories
   find $DIRTY_DIR -name ".*DS_Store" -exec rm -rf {} \;     # Delete all .DS_Store and ._.DS_Store files
   COUNTER=$(($COUNTER+1))
done
...

Je vois le résultat suivant:

trouver: `/media/disk1/Images/.AppleDouble': Aucun fichier ou répertoire de

Avant j'ai ajouté le "-exec rm ..." partie du script trouvé l' /media/disk1/Images/.AppleDouble répertoire. Le script fonctionne correctement pour la suppression des fichiers DS_Store, mais ce qui me manque pour la commande rechercher pour les répertoires?

J'ai peur de vis trop avec l'option-exec partie que je ne veux pas effacer des répertoires dans l'erreur.

  • Vous devez probablement avoir un -type d drapeau sur le premier rechercher et un -type f drapeau sur la deuxième (également n'avez pas besoin r sur le rm pour la seconde). Afin de ne pas supprimer les fichiers qui portent le nom des dossiers et vice versa, et afin de ne pas inutilement descendre.
  • Essayez de débogage avec -exec echo rm -rf {} \;. Je voudrais ajouter -depth pour assurer ./a/b/X/c/X est supprimé avant ./a/b/X
  • Merci pour la capture de ces. Je sais que je devrais être un peu plus prudent et avoir ajouté à mon script.
  • Dans ce cas, serait-il si mauvais ./a/b/X a été supprimé car je ne veux rien garder sous .AppleDouble de toute façon?
  • Ce que vous ressentez, c'est probablement que lorsque vous n'utilisez pas -delete, vous n'avez pas l'implicite -depth option; si vous vous retrouvez la suppression des fichiers qui ont été supprimés par les précédentes itérations de votre commande rechercher. Voir unix.stackexchange.com/questions/170999 pour plus d'informations.
InformationsquelleAutor El Jorge | 2014-03-17