LINUX.ORG.RU

{bash} удаление


1

1

Всем доброго времени суток. Подскажите каким образом можно удалить файлы и директории, которые выводит ls | grep X?

X - это часть имени. В гугле ссылки попрятали, вроде.

Что было: ls | grep X | xargs rm  — не то, почему?

rm -rf 'ls -R -a | grep X' — команда бред (или есть какой-то секрет ее реализации?), но «попытка не пытка..»

Спасибо.

>Что было: ls | grep X | xargs rm — не то, почему?
Не вижу никаких проблем, кроме того, что rm надо с ключом -r, а то он директории не будет удалять. То есть:

ls | grep X | xargs rm -r
Можно по вкусу добавить к ls ключи -R и -a.

>rm -rf 'ls -R -a | grep X' — команда бред (или есть какой-то секрет ее реализации?)

Есть. Кавычки другие: у вас ', а надо `. Или $(). То есть:
rm -rf $(ls -R -a | grep X)
или
rm -rf `ls -R -a | grep X`

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Спасибо, второй метод сработал.

А вот первый выдает:

ls | grep X
 "X Y Z"
 "I X A"
ls | grep X | xargs rm -r
rm: невозможно удалить файл "X": Нет такого файла или директории.
rm: невозможно удалить файл "Y": Нет такого файла или директории.
rm: невозможно удалить файл "Z": Нет такого файла или директории.
rm: невозможно удалить файл "I": Нет такого файла или директории.
rm: невозможно удалить файл "X": Нет такого файла или директории.
rm: невозможно удалить файл "A": Нет такого файла или директории.

ЧЯДНТ?

Kenarus
() автор топика

>ls | grep X

ls -1 |grep X, иначе grep не имеет смысла (тк работает построчно).

Более того, обе команды ошибочны, тк встретятся имена файлов с пробелами.

uzbl
()
Ответ на: комментарий от Kenarus

Правильно так:

for i in *X*; do rm -r «$i»; done

find -name '*X*' -delete

uzbl
()
Ответ на: комментарий от Kenarus

>ЧЯДНТ?
А, ну да. Там же пробелы. Интересно, как тогда первый метод сработал?

Похоже, у вас на ls поставлены алиас с ключом --quote-name (или -Q). Проверить можно командой (alias ls). Он заключает все выводимые имена файлов в двойные кавычки. Поэтому в команде с подстановкой ($()) все работает и пробелы обрабатываются корректно.

А вот xargs, по-моему, то ли сам обрабатывает двойные кавычки и куда-то они теряются, то ли он делит по пробелам, не обращая внимание на двойные кавычки. Попробуйте указать ключ --delimiter='\n' (или -d '\n')

А по-хорошему для всей этой операции лучше бы воспользоваться find, а не «ls | grep X». Он умеет удалять файлы и никаких лишних проблем не возникнет. Как-то так:

find . -name '*X*' -delete
или
find . -name '*X*' -maxdepth 1 -delete #Это если только в текущей директории, без поддиректорий

proud_anon ★★★★★
()
Ответ на: комментарий от uzbl

ls -1 не имеет смысла, поскольку ls выводит по одному названию в строке, если вывод идет не в терминал, а в пайп.

maloi ★★★★★
()
Ответ на: комментарий от maloi

Не понял, в чём разница:

$ ls -1
1 2 3
alsa-plugins-1.0.24
Desktop
hs-2007-16-a-full_jpg.jpg
xlog

$ ls -1 |cat
1 2 3
alsa-plugins-1.0.24
Desktop
hs-2007-16-a-full_jpg.jpg
xlog

uzbl
()
Ответ на: комментарий от uzbl

Надеюсь, не отправите читать маны

ls -1 |grep X — что то существенно изменило бы, в выводе?

Kenarus
() автор топика
Ответ на: комментарий от maloi

Возможно, не затрагивая find есть способы?

Kenarus
() автор топика
Ответ на: комментарий от proud_anon

Сработал метод rm -rf `ls | grep X`.

Ключа упомянутого вами нету, но есть для цвета.

Вариацию вида rm -rf $(***) не пробовал.

Kenarus
() автор топика
Ответ на: комментарий от proud_anon

«Оно просто работает» (с) ...

Поглядим, сейчас доделаю дела и загляну в маны, отпишусь)

Kenarus
() автор топика

find -name '*X*' -delete

AITap ★★★★★
()
Ответ на: комментарий от Ronnie-A

Подходит. Не в курсе ли вы, что будет быстрее, предложенное вами или предложенное выше «через find»?

Kenarus
() автор топика

Тема исчерпана.

Решается:

find . -name «*X*» -maxdepth 1 -delete (proud_anon)

for i in *X*; do rm -r «$i»; done (uzbl)

Спасибо: (!)proud_anon, (!)uzbl, maloi, Ronnia-A, AlTap.

Kenarus
() автор топика
Ответ на: комментарий от Ronnie-A

И если файлов много — может не хватить длины комстроки.

uzbl
()
Ответ на: комментарий от sdio

Самое очевидное было пропущено. Спасибо, для меня это лучший вариант!

Kenarus
() автор топика
Ответ на: комментарий от Ronnie-A

мягко говоря, херня
если файлов несколько - покажет гордую фигу
можно либо IFS Делать (что костыль), либо for file in `ls|grep X` (хотя это тоже наверное IFS потребует)

В любом случае, хорошие шеллы (тот же csh) сами умеют регекспы и rm *[XYZ][jkl]* работает, т.ч. нафиг не нужны эти ваши костыли из ls и грепа.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.