URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9119
[ Назад ]

Исходное сообщение
"Удаление с исключением."

Отправлено fire002 , 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/ со всем.

Содержание

Сообщения в этом обсуждении
"Удаление с исключением."
Отправлено Валенок , 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



"Удаление с исключением."
Отправлено sdog , 09-Май-11 22:29 
http://www.linuxquestions.org/questions/solaris-opensolaris-.../

"Удаление с исключением."
Отправлено fire002 , 09-Май-11 23:51 
> http://www.linuxquestions.org/questions/solaris-opensolaris-.../

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


"Удаление с исключением."
Отправлено pavlinux , 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 {} \;


"Удаление с исключением."
Отправлено ACCA , 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



"Удаление с исключением."
Отправлено pavlinux , 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 ./



"Удаление с исключением."
Отправлено ACCA , 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 назад?


"Удаление с исключением."
Отправлено pavlinux , 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 назад?

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


"Удаление с исключением."
Отправлено Вова , 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


"Удаление с исключением."
Отправлено Andrey Mitrofanov , 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/
$ _


"Удаление с исключением."
Отправлено Вова , 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/
> $ _

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


"Удаление с исключением."
Отправлено ACCA , 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}

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


"Удаление с исключением."
Отправлено Andrey Mitrofanov , 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/


"Удаление с исключением."
Отправлено XoRe , 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 {} \;


"Удаление с исключением."
Отправлено XoRe , 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 {} \;


"Удаление с исключением."
Отправлено pavlinux , 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 {} \;

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