Удалить каталог косвенно внутри себя

9

У меня есть каталог внутри себя. Как мне это удалить.

~/.local/share/Trash/files$ ls devices/
reg-dummy
~/.local/share/Trash/files$ ls devices/reg-dummy/
subsystem
~/.local/share/Trash/files$ ls devices/reg-dummy/subsystem/
devices

Также

~/.local/share/Trash/files$ find devices/ | head -n 20
devices/
devices/reg-dummy
devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy

Кроме того, хотя мой мозг не может решить проблему остановки, кажется, что это sudo rm -rf devicesпродолжается вечно, не производя результата.

~/.local/share/Trash/files$ sudo rm -rf devices
^C~/.local/share/Trash/files$

То же самое для perl -e 'use File::Path qw(remove_tree); remove_tree("$ENV{HOME}/.local/share/Trash/files/devices")'. То же самое для du -s devices/. То же самое для du -sch ~/.local/share/Trash/ других команд

$ cd ~/.local/share/Trash/files/devices/reg-dummy/subsystem/devices/
$ ls -ldi 
8131921 drwxr-xr-x 3 theking theking 4096 Mar 17 19:43 .
$ cd reg-dummy/subsystem/devices/
$ ls -dli
8131926 drwxr-xr-x 3 theking theking 4096 Mar 17 19:43 .


$ find .local/share/Trash/files/ -maxdepth 1 -delete
find: cannot delete `.local/share/Trash/files/devices': Directory not empty
find: cannot delete `.local/share/Trash/files/': Directory not empty

Я не хочу, чтобы это застряло в моем мусоре навсегда!

Примечание. Я просто делал грубое резервное копирование компьютера scp, но мне не хватило места, и тогда это произошло.

PyRulez
источник
Пожалуйста, покажите нам команду, которую вы пытались удалить, и ошибку, которую она вам дала. Что делает rm -rf devices?
Тердон
Пожалуйста, также добавьте выходные данные ls -dli devicesandls -dli devices/reg-dummy/subsystem/devices/
terdon
3
Первая команда должна была быть ls -ldi devices, а не device. Я пытаюсь увидеть, действительно ли это жесткие ссылки (тот же индекс). Однако имейте в виду, что если это большой каталог, rm -rfэто займет много времени, но в конечном итоге будет работать. Если проблема заключается в циклических ссылках, вы получите сообщение об ошибке бесконечной рекурсии. Если нет сообщения об ошибке, просто дайте rm -rfзапустить его курс.
Terdon
7
@terdon: Я думал, что Linux (Ubuntu, по крайней мере) не разрешает жестко связанные каталоги?
saiarcot895
2
Я просто предполагаю, что вы пытались использовать встроенную кнопку "пустой мусор" для nautilus? (возможно, они думали о таких вещах, когда писали наутилус ^^)
MrVaykadji

Ответы:

3

Вывод ls -ldiпокажет номер инода каталога. Если каталог внутри каталога действительно имеет тот же номер инода, что и его предок, а не просто то же имя, тогда ваша файловая система повреждена, и вам нужно будет загрузиться в режиме восстановления и выполнить fsck.

psusi
источник
1

Я все еще думаю, что rm -rfэто сработает, если вы уделите этому достаточно времени, но если нет, один или оба из них должны:

perl -e 'use File::Path qw(remove_tree); 
        remove_tree("$ENV{HOME}/.local/share/Trash/files/devices")'`

 

find .local/share/Trash/files/ -delete

Вы можете быть уверены, что что- то происходит, если вы используете, rm -rfv ~/.local/share/Trash/files/devicesпо крайней мере, это позволит вам знать, что файлы удаляются.

В любом случае, это не может быть проблемой жесткой ссылки (несмотря на мой очень неправильный комментарий), потому что каталоги не могут быть жестко связаны в Linux. В общем, когда у вас бесконечная рекурсия, как это может случиться с программными ссылками, вы получите сообщение об этом, которого, по-видимому, не происходит.

Другая возможность, о которой я могу подумать, заключается в том, что папка Trash - это некая странная система. Я действительно не знаю, как это работает, я никогда не использую это. Однако вам может повезти, если вы удалите файлы верхнего уровня напрямую, а не на проблемный каталог:

rm -rf ~/.local/share/Trash/* 

Вам также следует попробовать очистить папку «Корзина» из графического интерфейса, просто выберите «Корзина» и нажмите «Очистить корзину», посмотрите, работает ли она.

terdon
источник
Они оба потерпели неудачу. Вопрос пересмотрен.
PyRulez
@PyRulez, насколько большой этот каталог? Ни perl-скрипт, ни скрипт не rmпроизведут никакого вывода. Как долго они бежали? Я также обновил findкоманду, предыдущая была неправильной, извините. Посмотрите на обновленный ответ. Наконец, мы здесь работаем вслепую. Пожалуйста, обновите ваш вопрос с выводом, ls -lгде вы использовали ls, а также показать результат, du -sch ~/.local/share/Trash/чтобы мы знали размер.
Terdon
Я не мог найти размер.
PyRulez
@PyRulez попробуйте, du -sch ~/.local/share/Trash/что даст вам размер. И, пожалуйста, добавьте весь материал, который просили различные комментарии, они нужны, чтобы мы могли понять, что происходит.
Тердон
@tedron Я был.
PyRulez
0

(Я уверен, что это сработает, и, поскольку я собираюсь путешествовать прямо сейчас, я оставлю это как ответ, который я могу удалить в будущем, если он не будет работать.)

  1. Во-первых, чтобы быть в безопасности, беги

    find ~/.local/share/Trash/files/devices/ -exec echo {} \;
    
  2. Во-вторых, если при выводе «1» не было обнаружено ни одного важного файла, запустите

    find ~/.local/share/Trash/files/devices/ -exec rm {} \;
    
  3. Последний шаг будет

    find ~/.local/share/Trash/files/devices/ -empty -type d -delete
    
desgua
источник