Не удаляется каталог через find

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

djo
Сообщения: 18
ОС: Debian

Не удаляется каталог через find

Сообщение djo »

Здравствуйте! Почему не работает такая конструкция?

Код: Выделить всё

#!/bin/bash
# del covers
DIR=/home/disk/Download/Дмитрий
for files in $(find $DIR -name "сovers")
do
rm -rf $files
done
if [ $? = 0 ]; then
echo "Yes...files was deleted..by...by!"
fi

Папка covers как была так и остается в директории, но через это работает:

Код: Выделить всё

find . -name "covers" -exec rm -rf {} \;

И даже если так сделать, то все равно не удаляется:

Код: Выделить всё

#!/bin/bash
# del covers
DIR=/home/disk/Download/Дмитрий
find $DIR -name "covers" -exec rm -rf {} \;
if [ $? = 0 ]; then
echo "Yes...files was deleted..by...by!"
fi
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Не удаляется каталог через find

Сообщение /dev/random »

djo писал(а):
02.05.2011 23:45
но через это работает:

Код: Выделить всё

find . -name /home/disk/Download/Дмитрий -exec rm -rf {} \;

Путь в параметре -name сработать не может в принципе, там должно быть только имя. Вероятно, вы неправильно переписали команду на форум, или же ошибаетесь, считая, что она сработала.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3085
ОС: Gentoo

Re: Не удаляется каталог через find

Сообщение ormorph »

Да вроде такая конструкция работать должна, скорее всего путь не тот, ну и если путь содержит пробелы, то следует его заключить в кавычки.
проверьте вывод подставив вместо rm -rf $files команду echo $files и просмотрите вывод.
Спасибо сказали:
djo
Сообщения: 18
ОС: Debian

Re: Не удаляется каталог через find

Сообщение djo »

/dev/random писал(а):
02.05.2011 23:56
djo писал(а):
02.05.2011 23:45
но через это работает:

Код: Выделить всё

find . -name /home/disk/Download/Дмитрий -exec rm -rf {} \;

Путь в параметре -name сработать не может в принципе, там должно быть только имя. Вероятно, вы неправильно переписали команду на форум, или же ошибаетесь, считая, что она сработала.

Исправил параметр name, неправильно переписал.


ormorph писал(а):
03.05.2011 10:42
Да вроде такая конструкция работать должна, скорее всего путь не тот, ну и если путь содержит пробелы, то следует его заключить в кавычки.
проверьте вывод подставив вместо rm -rf $files команду echo $files и просмотрите вывод.

Нет, все равно не получается. Путь верный, с этим путем если просто указать find, то он их находит и удаляет.

Код: Выделить всё

find . -name /home/disk/Download/Дмитрий -exec rm -rf {} \;
в тех двух случаях не находит, find вообще не активируется.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Не удаляется каталог через find

Сообщение /dev/random »

Наберите (а лучше скопипастите в терминал) последовательно следующие строки:

cd
ls -d /home/disk/Download/Дмитрий
find /home/disk/Download/Дмитрий -name covers
cd /home/disk/Download/Дмитрий
find . -name covers

и приведите подробный вывод каждой. Сделайте точную копипасту из терминала, от первой команды до последнего вывода.
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Не удаляется каталог через find

Сообщение Ginzburg »

LANG ?
Я конечно далек от мысли... (с)
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Не удаляется каталог через find

Сообщение /dev/random »

/dev/random писал(а):
03.05.2011 14:24
Наберите (а лучше скопипастите в терминал) последовательно следующие строки:

cd
ls -d /home/disk/Download/Дмитрий
find /home/disk/Download/Дмитрий -name covers
cd /home/disk/Download/Дмитрий
find . -name covers

и приведите подробный вывод каждой. Сделайте точную копипасту из терминала, от первой команды до последнего вывода.

Поскольку я сейчас ухожу, то привожу здесь свои подозрения, не дожидаясь их подтверждения или опровержения.
Если /path/to/dir - симлинк на каталог, а не каталог, то find /path/to/dir найдёт только сам /path/to/dir. В то же время find /path/to/dir/ (обратите внимание на слэш в конце) будет искать внутри каталога. Если это у вас действительно симлинк, то можете не приводить информацию, про которую я говорил, поскольку ответ будет уже найден. Если же нет, то приведите её, и, возможно, кто-то, основываясь на ней, поможет вам.
Спасибо сказали:
djo
Сообщения: 18
ОС: Debian

Re: Не удаляется каталог через find

Сообщение djo »

Код: Выделить всё

cd
zhenya@linux:~$

ls -d /home/disk/Download/Дмитрий
/home/disk/Download/Дмитрий

find /home/disk/Download/Дмитрий -name covers
/home/disk/Download/Дмитрий/Выпуск 1. 2004 год/covers

cd /home/disk/Download/Дмитрий
zhenya@linux:/home/disk/Download/Дмитрий$

find . -name covers
./Выпуск 1. 2004 год/covers
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Не удаляется каталог через find

Сообщение Ginzburg »

IFS=$'\n'
либо
find ... | while read files; do
Я конечно далек от мысли... (с)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Не удаляется каталог через find

Сообщение sash-kan »

/dev/random писал(а):
03.05.2011 14:42
Если /path/to/dir - симлинк на каталог
тогда надо было спрашивать вывод
$ ls -ld /home/disk/Download/Дмитрий
а не
$ ls -d /home/disk/Download/Дмитрий
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Не удаляется каталог через find

Сообщение sash-kan »

djo писал(а):
02.05.2011 23:45
Здравствуйте! Почему не работает такая конструкция?

Код: Выделить всё

#!/bin/bash
# del covers
DIR=/home/disk/Download/Дмитрий
for files in $(find $DIR -name "сovers")
do
rm -rf $files
done
if [ $? = 0 ]; then
echo "Yes...files was deleted..by...by!"
fi
вам уже сказали про пробелы в имени. собственно, так лучше не делать.

QUOTE писал(а):И даже если так сделать, то все равно не удаляется:

Код: Выделить всё

#!/bin/bash
# del covers
DIR=/home/disk/Download/Дмитрий
find $DIR -name "covers" -exec rm -rf {} \;
if [ $? = 0 ]; then
echo "Yes...files was deleted..by...by!"
fi
я думаю, что всё-таки удаляется. но find завершается с ошибкой и, следовательно, сообщение "Yes...files was deleted..by...by!" не выводится.
чтобы find не завершался с ошибкой, надо добавить параметр -depth:
find $DIR -depth -name "covers" -exec rm -rf {} \;
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3085
ОС: Gentoo

Re: Не удаляется каталог через find

Сообщение ormorph »

Так вы пробовали прописывать команду echo ?
У меня например все нормально листинг содержимого идет:

Код: Выделить всё

#!/bin/bash

for files in $(find ~/Документы)
do
echo "$files"
done


Другое дело у вас имя каталога содержит пробелы
djo писал(а):
03.05.2011 14:46

Код: Выделить всё

find . -name covers
./Выпуск 1. 2004 год/covers


Следовательно удаляться и не должно, тогда следует заключить переменную в кавычки
пример:

Код: Выделить всё

rm -rf "$files"


Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Не удаляется каталог через find

Сообщение drBatty »

djo писал(а):
02.05.2011 23:45
!"

$

echo "!" bash: !: event not found $ echo '!' # восклицательный знак - особый символ. используйте одиночные кавычки !


sash-kan писал(а):
03.05.2011 15:56
чтобы find не завершался с ошибкой, надо добавить параметр -depth:

+1
тогда сначала удаляются под каталоги, а потом сами каталоги. А не наоборот. -delete автоматически добавляет -depth.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Не удаляется каталог через find

Сообщение Ginzburg »

Следовательно удаляться и не должно, тогда следует заключить переменную в кавычки



echo "-- $files --"

-- /home/ginzburg/ooo/Выпуск --
-- 1. --
-- 2004 --
-- год/covers --
Я конечно далек от мысли... (с)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Не удаляется каталог через find

Сообщение sash-kan »

ormorph
неверна уже сама констукция цикла:
for files in $(find ~/Документы)

повторюсь: так лучше не делать.

p.s. можно сделать так:
find ... | while read files; do ... "$files" ...; done
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3085
ОС: Gentoo

Re: Не удаляется каталог через find

Сообщение ormorph »

Ginzburg писал(а):
03.05.2011 16:05
Следовательно удаляться и не должно, тогда следует заключить переменную в кавычки



echo "-- $files --"

-- /home/ginzburg/ooo/Выпуск --
-- 1. --
-- 2004 --
-- год/covers --


Хм ну да оператор for понимает пробелы как отдельные элементы списка.
тогда строчку $(find $DIR -name "covers") тоже следует взять в кавычки.

Ну и самое простое наверное это просто использовать внутренние команды find.
find . -name "covers" -delete
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Не удаляется каталог через find

Сообщение Ginzburg »

тогда строчку $(find $DIR -name "covers") тоже следует взять в кавычки.


ginzburg@ws112-ubuntu:~$ for files in "$(find /home/ginzburg/ooo -name covers)"; do echo "-- $files --"; done
-- /home/ginzburg/ooo/Выпуск 1. 2004 год/covers
/home/ginzburg/ooo/covers --
Я конечно далек от мысли... (с)
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3085
ОС: Gentoo

Re: Не удаляется каталог через find

Сообщение ormorph »

Ginzburg писал(а):
03.05.2011 17:54
тогда строчку $(find $DIR -name "covers") тоже следует взять в кавычки.


ginzburg@ws112-ubuntu:~$ for files in "$(find /home/ginzburg/ooo -name covers)"; do echo "-- $files --"; done
-- /home/ginzburg/ooo/Выпуск 1. 2004 год/covers
/home/ginzburg/ooo/covers --

Ну тогда оператор for для этого лучше не использовать
лучше подойдет оператор while
пример:

Код: Выделить всё

#!/bin/bash

DIR=/home/disk/Download/Дмитрий
find $DIR -name "covers"|while read files
do
rm -rf "$files"
done
if [ $? = 0 ]; then
echo "Yes...files was deleted..by...by!"
fi
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Не удаляется каталог через find

Сообщение Ginzburg »

извращенный метод для баша

Код: Выделить всё

. <(find /home/ginzburg/ooo -name covers -printf "rm -rf '%p'\n")



про фор выше есть ответ
Я конечно далек от мысли... (с)
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3085
ОС: Gentoo

Re: Не удаляется каталог через find

Сообщение ormorph »

Ginzburg писал(а):
03.05.2011 18:09
про фор выше есть ответ


Ну да IFS=$'\n' работает!
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Не удаляется каталог через find

Сообщение watashiwa_daredeska »

А если \n в имени файла будет?
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Не удаляется каталог через find

Сообщение sash-kan »

watashiwa_daredeska писал(а):
03.05.2011 18:36
А если \n в имени файла будет?
а те, у кого есть такие файлы, обречены на find ... -print0 | xargs -0 ...
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Не удаляется каталог через find

Сообщение Ginzburg »

законный вопрос
Я конечно далек от мысли... (с)
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Не удаляется каталог через find

Сообщение Ginzburg »

то же будет вопрос о \001 )

find $DIR -name "`echo -en 'cove\nrs'`" -printf "%p\001"
Я конечно далек от мысли... (с)
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3085
ОС: Gentoo

Re: Не удаляется каталог через find

Сообщение ormorph »

Ginzburg писал(а):
03.05.2011 19:06
то же будет вопрос о \001 )

find $DIR -name "`echo -en 'cove\nrs'`" -printf "%p\001"


Если бы эти команды выдавали переход к другой строке, ато показывает вопрос вместо перехода cove?rs
реально действует для удаления find . -name "`echo -en 'cove\nrs'`" -delete
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Не удаляется каталог через find

Сообщение drBatty »

watashiwa_darede... писал(а):
03.05.2011 18:36
А если \n в имени файла будет?

это называется ССЗБ :)
и да, man xargs. Можно ещё man ls, что-бы получить список имён в нужном формате. (например c-style).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
djo
Сообщения: 18
ОС: Debian

Re: Не удаляется каталог через find

Сообщение djo »

Если вот так вот сделать просто в терминале :

Код: Выделить всё

for files in "$(find /home/ginzburg/ooo -name covers)"; do echo "-- $files --"; done

то работает и вот так:

Код: Выделить всё

#!/bin/bash
# delcovers
DIR=/home/disk/Download/Дмитрий
find $DIR -depth -name "covers" -exec rm -rf {} \;
if [ $? = 0 ]; then
echo "Yes...files was deleted..by...by"
fi

а остальное нет.
Всем спасибо!

Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Не удаляется каталог через find

Сообщение Ginzburg »

вобщето это было как абсолютно не правильно, правильно было выше
Я конечно далек от мысли... (с)
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Не удаляется каталог через find

Сообщение ZyX »

Какие несчастливые люди: половина темы про то, как правильно получать от find имена файлов. Вам так нужна скорость find? Если нет, то с данной конкретной задачей справляется даже bash globbing, не то что zsh: rm -rf $DIR/**/covers (лучше всего в zsh: по-умолчанию это вернёт ошибку если ничего не найдено, тогда как в bash попытается удалить $DIR/**/covers, да ещё и потребуются двойные штрихи вокруг $DIR). Требует установки какой-то настройки в bash.
Спасибо сказали:
Ginzburg
Сообщения: 37
ОС: Windows Vista

Re: Не удаляется каталог через find

Сообщение Ginzburg »

mkdir -p "$DIR/1/2/3/4/covers"
rm -rf $DIR/**/covers

???
Я конечно далек от мысли... (с)
Спасибо сказали: