Cp -R récursif accidentel, maintenant ne peut pas supprimer le fichier en utilisant la corbeille ou rm

4

Après une faute de frappe dans un chemin lors de l' utilisation cp, il me semble avoir accidentellement copié le dossier pour se récursive, et maintenant je ne peux pas supprimer ce dossier à l' aide rm -rfou la Corbeille sous Mac OS X Finder. Le fichier se trouve sur le disque de démarrage (donc HFS + J).

Le résultat de rm -rfest juste Directory not emptyrépété, comme suit:

rm: o/old/old/old/old/old/old/old/old: Directory not empty
rm: o/old/old/old/old/old/old/old: Directory not empty
rm: o/old/old/old/old/old/old: Directory not empty
rm: o/old/old/old/old/old: Directory not empty
rm: o/old/old/old/old: Directory not empty
rm: o/old/old/old: Directory not empty
rm: o/old/old: Directory not empty
rm: o/old: Directory not empty
rm: o: Directory not empty

Que dois-je faire pour supprimer ce dossier?

Comme vous pouvez le constater, j'ai essayé de renommer le premier dossier pour raccourcir le chemin du fichier. Le dossier passe à l'état Trashfin, mais ne sera pas supprimé à cause du dialogue d'alerte suivant:

The operation cant be completed because the item is in use.
georgeunix
la source
Essayez lsof ode voir qui utilise votre répertoire o. Ensuite, vous pouvez voir quoi fermer. Vous avez probablement ouvert un terminal dans ce répertoire et / ou vous démarrez un programme à partir de ce répertoire.
Hastur
lsof one renvoie rien, @Hastur
georgeunix le
fuser oretourso:
georgeunix

Réponses:

3

Essayer

find o -delete

ou

find o -depth -delete

-depthindique findd'aller d'abord dans la partie la plus profonde de l'arborescence, puis de revenir en arrière. La page de manuel indique, "L'utilisation de -deletel' -depthoption active automatiquement l' option". Si votre version de findne supporte pas -delete, essayez

find o -depth -exec rm -rf {} ";"
Scott
la source
Merci pour la suggestion, mais malheureusement, cela ne fonctionne pas:No space left on device
georgeunix
Étrangement, df -hretourne15Gi free
georgeunix le
Cela n'a pas beaucoup de sens; ces commandes ne devraient rien écrire dans le système de fichiers. (Pour séparer les cheveux; delete / rm/ unlink écrase les entrées du répertoire avec nuls, et modifie la liste libre pour y ajouter les blocs désalloués, mais il ne faut rien faire qui devrait tenter d’ allouer des blocs libres à partir de la liste libre. ) Une explication est qu'il findfaut écrire un fichier temporaire pour sauvegarder la structure de répertoires de votre " o" arborescence au fur et à mesure de sa lecture. Vérifiez df -h /tmp.
Scott
J'ai bien peur que ce soit la même réponse dedf -h
georgeunix
Eh bien, en fait, c’est 11 Giparce que j’utilise mon ordinateur depuis, mais quand même
georgeunix
2

Eh bien, je viens d'avoir le même problème. Je l'ai résolu en raccourcissant le nom de chacun des répertoires imbriqués.

Comme il s’agit d’un problème ponctuel, je n’ai pas essayé de créer une magie de script intelligente. Je viens d'écrire

for FILE in $(ls); do mv $FILE a; cd a; done

dans un shell, puis appuyez sur up arrowpour appeler la commande, et return. Avec un doigt sur chaque touche, je viens de répéter les deux frappes rapidement jusqu'au répertoire le plus profond. Ensuite cd ~et cdà la racine de l'arbre défectueux. Un habitué a rm -rmaintenant fait le travail.

Mathias Laurin
la source
J'ai essayé ceci. J'ai mis tous les noms de répertoires sur "o", mais en vain: ils ne seraient toujours pas supprimés. C’est une bonne idée cependant et cela vaut la peine d’essayer si vous rencontrez un tel problème.
georgeunix
Moi aussi j'ai fait un accidentellement 'cp -R'. La commande rm échouait sur un fichier situé plus bas dans l'arborescence de répertoires en raison des chemins imbriqués. Je devais faire rm -rf old/ 2>&1 | lesspour trouver la profondeur du fichier. Ensuite, j'ai couru cette forboucle plusieurs fois pour raccourcir suffisamment le chemin pour supprimer les fichiers. Merci.
Bradley M pratique
1

Si vous l'obtenez, c'est évident. Parce que vous ne pouvez pas recurse au fond, vous devriez déplacer le répertoire qui est un niveau plus profond juste un niveau plus haut. Après cela, il reste un répertoire avec une profondeur "un" qui peut être supprimé.

Supposons que vous avez un répertoire "infini" a / a / a / a / a / a / a / ....

alors vous faites:

mv a/a b
rm -r a
mv b/a a
rm -r b

Répétez jusqu'à ce qu'il ne reste plus de répertoire.

Le script suivant le fait: (vous devez appuyer sur ctrl-c après la fin)

while [ true ]; do mv a/a b; rm -r a; mv b/a a; rm -r b; done

Comme les noms sont identiques, les scripts «basculent» entre deux noms temporaires.

Dirk Thannhäuser
la source