Собсно, есть директория:
/home/1/
в ней ряд файлов и других директорий.
home/1/2/
home/1/3/
В каждой из директорий, опять-же есть файлы и папки.
так-же, в директории /home/1/2/ есть папка 6 c файлами.
Суть задачи, удалить все файлы и директории, кроме /home/1/2/6/ и файлов в ней.
Пробовал find с grep -v, но он таки удаляет /home/1/2/ со всем.
> Собсно, есть директория:
> /home/1/
> в ней ряд файлов и других директорий.
> home/1/2/
> home/1/3/
> В каждой из директорий, опять-же есть файлы и папки.
> так-же, в директории /home/1/2/ есть папка 6 c файлами.
> Суть задачи, удалить все файлы и директории, кроме /home/1/2/6/ и файлов в
> ней.
> Пробовал find с grep -v, но он таки удаляет /home/1/2/ со всем.mc
http://www.linuxquestions.org/questions/solaris-opensolaris-.../
> http://www.linuxquestions.org/questions/solaris-opensolaris-.../Не совсем тот вариант. Почитайте первый пост внимательней.
>> 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 {} \;
> 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
> Или ещё хлеще -
> 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 ./
>> Или ещё хлеще -
>> mv /home/1/2/6 /home ; rm -rf /home/1 ; mkdir -p /home/1/2 ; mv /home/6 /home/1/2/6
> Только root может создавать каталоги в /homeIMHO, вопрос был - что может наделать укуреный 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 назад?
>> 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 назад?На бумажку записать :)
> Собсно, есть директория:
> /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
> так-же, в директории /home/1/2/ есть папка 6 c файлами.
> Суть задачи, удалить все файлы и директории, кроме /home/1/2/6/ и файлов в
> ней.
> Пробовал find с grep -v, но он таки удаляет /home/1/2/ со всем.$ cat ./x.sh
#!/bin/bashmkdir tst || exit
cd tstmkdir -p 1/{1,2,3}/{5,6,7}
touch 1/{1,2,3}/{5,6,7}/fileecho "BEFORE:"
find 1/ -depthecho "TEST:"
find 1/ -depth -path 1/2/6/* -prune -o -deleteecho "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/
$ _
>[оверквотинг удален]
> 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/
> $ _Это верный вариант, так и надо делать, через файнд, у утилиты довольно сильная логика условий. Я как-то пропустил в постановке задачи "и файлы в директории", тоже бы это написал, варианты выше - как ересь.
> touch 1/{1,2,3}/{5,6,7}/fileдобавь
touch 1/2/6_junk_file_{1..100}
touch 1/2_junk_file_{1..100}Предположим, что их тоже нужно удалять.
> добавьДобавил.
> 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/
> Собсно, есть директория:
> /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 {} \;
> 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 {} \;
>> 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 {} \;Не, у Митрофаныча короче :)