The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Удаление с исключением."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Удаление с исключением."  +/
Сообщение от fire002 email(ok) on 09-Май-11, 16:17 
Собсно, есть директория:
/home/1/
в ней ряд файлов и других директорий.
home/1/2/
home/1/3/
В каждой из директорий, опять-же есть файлы и папки.
так-же, в директории /home/1/2/ есть папка 6 c файлами.
Суть задачи, удалить все файлы и директории, кроме /home/1/2/6/ и файлов в ней.
Пробовал find с grep -v, но он таки удаляет /home/1/2/ со всем.
Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Удаление с исключением."  +/
Сообщение от Валенок on 09-Май-11, 16:53 
> Собсно, есть директория:
> /home/1/
> в ней ряд файлов и других директорий.
> home/1/2/
> home/1/3/
> В каждой из директорий, опять-же есть файлы и папки.
> так-же, в директории /home/1/2/ есть папка 6 c файлами.
> Суть задачи, удалить все файлы и директории, кроме /home/1/2/6/ и файлов в
> ней.
> Пробовал find с grep -v, но он таки удаляет /home/1/2/ со всем.

mc


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Удаление с исключением."  +/
Сообщение от sdog (ok) on 09-Май-11, 22:29 
http://www.linuxquestions.org/questions/solaris-opensolaris-.../
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Удаление с исключением."  +/
Сообщение от fire002 email(ok) on 09-Май-11, 23:51 
> http://www.linuxquestions.org/questions/solaris-opensolaris-.../

Не совсем тот вариант. Почитайте первый пост внимательней.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Удаление с исключением."  +/
Сообщение от pavlinux (ok) on 10-Май-11, 01:46 
>> http://www.linuxquestions.org/questions/solaris-opensolaris-.../
> Не совсем тот вариант. Почитайте первый пост внимательней.

cd /home; find . -type f -print | grep -v '1/2/6/' | xargs rm -f ; find -type d -exec rmdir {} \;

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Удаление с исключением."  +/
Сообщение от ACCA (ok) on 10-Май-11, 02:04 
> cd /home; find . -type f -print | grep -v '1/2/6/' |
> xargs rm -f ; find -type d -exec rmdir {} \;

На мой взгляд, это было бы семантически правильнее:

touch /tmp/ref ; chmod --reference=/home/1/2/6 /tmp/ref ; chmod -rwx /home/1/2/6 ; rm -rf /home/1 2> /dev/null ; chmod --reference=/tmp/ref /home/1/2/6 ; rm /tmp/ref


Или ещё хлеще -

mv /home/1/2/6 /home ; rm -rf /home/1 ; mkdir -p /home/1/2 ; mv /home/6 /home/1/2/6


Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Удаление с исключением."  +/
Сообщение от pavlinux (ok) on 10-Май-11, 02:27 
> Или ещё хлеще -
> mv /home/1/2/6 /home ; rm -rf /home/1 ; mkdir -p /home/1/2 ; mv /home/6 /home/1/2/6

Только root может создавать каталоги в /home

...
Ну раз пошла такая пьянка ...

1. chartt +i /home/1/2/6/*; rm -rf /home/1; chartt -i /home/1/2/6/*;

2. chown -R nobody /home/1/; chown -R root /home/1/2/6/; sudo -u nobody rm -rf ./


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "Удаление с исключением."  +/
Сообщение от ACCA (ok) on 10-Май-11, 03:23 
>> Или ещё хлеще -
>> mv /home/1/2/6 /home ; rm -rf /home/1 ; mkdir -p /home/1/2 ; mv /home/6 /home/1/2/6
> Только root может создавать каталоги в /home

IMHO, вопрос был - что может наделать укуреный root?

> 1. chartt +i /home/1/2/6/*; rm -rf /home/1; chartt -i /home/1/2/6/*;

acca@acca96:~/tmp$ chartt
chartt: command not found

Прогнал. chattr хорошее решение, если гарантируется /home/1/2/6/*.

> 2. chown -R nobody /home/1/; chown -R root /home/1/2/6/; sudo -u nobody
> rm -rf ./

А как вернуть chown назад?

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Удаление с исключением."  +/
Сообщение от pavlinux (ok) on 10-Май-11, 04:02 
>> 1. chartt +i /home/1/2/6/*; rm -rf /home/1; chartt -i /home/1/2/6/*;
> acca@acca96:~/tmp$ chartt
> chartt: command not found

ну бывает...
> Прогнал. chattr хорошее решение, если гарантируется /home/1/2/6/*.
>> 2. chown -R nobody /home/1/; chown -R root /home/1/2/6/; sudo -u nobody
>> rm -rf ./
> А как вернуть chown назад?

На бумажку записать :)

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "Удаление с исключением."  +/
Сообщение от Вова on 10-Май-11, 06:49 
> Собсно, есть директория:
> /home/1/
> в ней ряд файлов и других директорий.
> home/1/2/
> home/1/3/
> В каждой из директорий, опять-же есть файлы и папки.
> так-же, в директории /home/1/2/ есть папка 6 c файлами.
> Суть задачи, удалить все файлы и директории, кроме /home/1/2/6/ и файлов в
> ней.
> Пробовал find с grep -v, но он таки удаляет /home/1/2/ со всем.

inum=`ls -i /home/1/2/6| sed 's/ .*//'` find  /home/1 ! -inum $inum -delete

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

10. "Удаление с исключением."  +1 +/
Сообщение от Andrey Mitrofanov on 10-Май-11, 12:03 
> так-же, в директории /home/1/2/ есть папка 6 c файлами.
> Суть задачи, удалить все файлы и директории, кроме /home/1/2/6/ и файлов в
> ней.
> Пробовал find с grep -v, но он таки удаляет /home/1/2/ со всем.

$ cat ./x.sh
#!/bin/bash

mkdir tst || exit
cd tst

mkdir -p 1/{1,2,3}/{5,6,7}
touch 1/{1,2,3}/{5,6,7}/file

echo "BEFORE:"
find 1/ -depth

echo "TEST:"
find 1/ -depth -path 1/2/6/* -prune -o -delete

echo "AFTER:"
find 1/ -depth
$ ./x.sh
BEFORE:
1/1/5/file
1/1/5
1/1/6/file
1/1/6
1/1/7/file
1/1/7
1/1
1/2/5/file
1/2/5
1/2/6/file
1/2/6
1/2/7/file
1/2/7
1/2
1/3/5/file
1/3/5
1/3/6/file
1/3/6
1/3/7/file
1/3/7
1/3
1/
TEST:
find: cannot delete `1/2/6': Каталог не пуст
find: cannot delete `1/2': Каталог не пуст
find: cannot delete `1/': Каталог не пуст
AFTER:
1/2/6/file
1/2/6
1/2
1/
$ _

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

11. "Удаление с исключением."  +/
Сообщение от Вова on 10-Май-11, 13:22 
>[оверквотинг удален]
> TEST:
> find: cannot delete `1/2/6': Каталог не пуст
> find: cannot delete `1/2': Каталог не пуст
> find: cannot delete `1/': Каталог не пуст
> AFTER:
> 1/2/6/file
> 1/2/6
> 1/2
> 1/
> $ _

Это верный вариант, так и надо делать, через файнд, у утилиты довольно сильная логика условий. Я как-то пропустил в постановке задачи "и файлы в директории", тоже бы это написал, варианты выше  - как ересь.

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

12. "Удаление с исключением."  +/
Сообщение от ACCA (ok) on 10-Май-11, 13:59 
> touch 1/{1,2,3}/{5,6,7}/file

добавь

touch 1/2/6_junk_file_{1..100}
touch 1/2_junk_file_{1..100}

Предположим, что их тоже нужно удалять.

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

13. "Удаление с исключением."  +/
Сообщение от Andrey Mitrofanov on 10-Май-11, 14:24 
> добавь

Добавил.

> touch 1/2/6_junk_file_{1..100}
> touch 1/2_junk_file_{1..100}

Без {...} - для теста достаточно одной таблэтки.

> Предположим, что их тоже нужно удалять.

Удалились. Без изменения основной строки.

...
Для полноты :)) тест-кейса сделал -

mkdir -p 1/{1,2,3}/{5,6,7}
touch 1{,/{1,2,3}{,/{5,6,7}}}/file

Получил "тот же" результат -

TEST:
find: cannot delete `1/2/6': Каталог не пуст
find: cannot delete `1/2': Каталог не пуст
find: cannot delete `1/': Каталог не пуст
AFTER:
1/2/6/file
1/2/6
1/2
1/

Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

14. "Удаление с исключением."  +/
Сообщение от XoRe (ok) on 10-Май-11, 14:56 
> Собсно, есть директория:
> /home/1/
> в ней ряд файлов и других директорий.
> home/1/2/
> home/1/3/
> В каждой из директорий, опять-же есть файлы и папки.
> так-же, в директории /home/1/2/ есть папка 6 c файлами.
> Суть задачи, удалить все файлы и директории, кроме /home/1/2/6/ и файлов в
> ней.
> Пробовал find с grep -v, но он таки удаляет /home/1/2/ со всем.

rm -rf /home/[^1]*
rm -rf /home/1/[^2]*
rm -rf /home/1/2/[^6]*

или

find ! -path './1/2/6' -a ! -path './1/2/6/*' -exec rm -r {} \;

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

15. "Удаление с исключением."  +/
Сообщение от XoRe (ok) on 10-Май-11, 17:11 
> find ! -path './1/2/6' -a ! -path './1/2/6/*' -exec rm -r {}
> \;

Точнее так:

find ! -path './1' -a ! -path './1/2' -a ! -path './1/2/6' -a ! -path './1/2/6/*' -exec rm -r {} \;

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

16. "Удаление с исключением."  +/
Сообщение от pavlinux (ok) on 11-Май-11, 01:23 
>> find ! -path './1/2/6' -a ! -path './1/2/6/*' -exec rm -r {}
>> \;
> Точнее так:
> find ! -path './1' -a ! -path './1/2' -a ! -path './1/2/6' -a ! -path './1/2/6/*' -exec rm -r {} \;

Не, у Митрофаныча короче :)

Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру