2015-06-29 6 views
1

Я пытаюсь удалить пустые каталоги в Linux. Прежде чем сделать это, я удаление файлов не доступ в последние 7 дней с помощью следующей командыУдалить каталог и его подкаталоги в одной команде

for x in $(cut -d: -f1 /etc/passwd); do 
    if [ -d "/srv/${x}" ]; then 
    find /srv/${x} -mindepth 1 -type f -not -amin -10080 -exec rm {} \; 
    fi 
done 

После того, как файлы будут удалены, я хочу, чтобы удалить пустую директорию. Для этого я делаю это следующим образом

for x in $(cut -d: -f1 /etc/passwd); do 
    if [ -d "/srv/${x}" ]; then 
    find /srv/${x} -type d -empty -exec rmdir {} \; 
    fi 
done 

Я попробовал это на следующий реж структуру

/srv/abc/ 
├── test1 
│   └── test1  (This is File) 
├── test2 
│   └── test4 
│    └── test2 (This is File) 
└── test3 

После выполнения/SRV/абв -типа е -exec гт {} \; Теперь только каталоги оставшиеся

/srv/abc/ 
├── test1 
├── test2 
│   └── test4 
└── test3 

Так что я побежал

find /srv/abc/ -type d -empty -exec rmdir {} \; 

Теперь

/srv/abc/ 
└── test2 

Затем снова

find /srv/abc/ -type d -empty -exec rmdir {} \; 

Так что я хочу, чтобы удалить все пустые реж только в на e. Я знаю, что происходит. Когда я впервые запускаю find /srv/abc/ -type d -empty -exec rmdir {} \; Он удаляет пустой каталог в этом экземпляре (который является test1, test3, test2/test4, но не test2)

Так как же удалить test2 в той же команде, если его подкаталоги также пусты?

Благодаря

+1

Примечание: '-not -amin -10080' может быть заменен на' -amin + 10080' (изменение '-' на' + '). –

+0

Спасибо за это предложение – roy

+0

Вы не можете сделать это тривиально; из определения OS '(find) перспективы test2 (каталог в lvl 3) * не * пуст, так как в нем есть пустой подкаталог. – tink

ответ

2

Команда rmdir имеет дополнительный -p или --parents вариант:

-p, --parents 
      remove DIRECTORY and its ancestors; e.g., 'rmdir -p a/b/c' is similar to 'rmdir a/b/c a/b a' 

Этот вариант должен делать то, что вы хотите.


В вашем примере каталог ...

/srv/abc/ 
├── test1 
├── test2 
│ └── test4 
└── test3 

Использование rmdir -p /srv/abc/test4 удалит test4 и test2 каталоги, но не каталог abc, потому что он все еще содержит test1 и test2.
Оттуда rmdir -p /srv/abc/test1 удалит только test1, но после этого rmdir -p /srv/abc/test3 удалит test3 и abc.

+0

После запуска find/srv/abc/-type d -empty -exec rmdir -p {} \; Я получаю следующее сообщение: rmdir: не удалось удалить каталог '/ srv/abc ': каталог не пуст find:'/srv/abc/test3': нет такого файла или каталога rmdir: не удалось удалить каталог '/ srv/abc ': Directory not empty find: '/ srv/abc/test1': Нет такого файла или каталога rmdir: не удалось удалить каталог'/srv ': занято или занято занято find: '/ srv/abc/test2/test2 ': Нет такого файла или каталога – roy

+0

Как я могу исключить/srv/&/srv/abc/из этого списка. Я не хочу его удалять – roy

+1

Вы должны 'cd''/srv/abc', а затем использовать 'find .' вместо абсолютного пути. Вы также можете подавить «непустые» сбои с помощью '--ignore-fail-on-non-empty'. Подробнее см. «Man rmdir». Если это не сработает, вы всегда можете отказаться от STDERR. –

Смежные вопросы