Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: rm и echo не понимают строку с переносом  (Прочитано 3077 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн avi9526

  • Автор темы
  • Активист
  • *
  • Сообщений: 618
  • ахтыжъёшкинкот
    • Просмотр профиля
    • Блог av9526
(Нажмите, чтобы показать/скрыть)
Предыстория:
Треминал и sh-скрипт
Есть папка со следующими файлами/папками
Неназвана тека
Неназваний документ
DEBIAN
мне нужно удалить все кроме DEBIAN
ls | awk '$0 !~ /DEBIAN/ {print($0)}'выдает
Неназвана тека
Неназваний документ
Проблема:
но как это удалить, мне не известно, потому как "rm" воспринимает это непонятным образом
rm `ls | awk '$0 !~ /DEBIAN/ {print($0)}'`
rm: не вдається видалити `Неназвана': Нет такого файла или каталога
rm: не вдається видалити `тека': Нет такого файла или каталога
rm: не вдається видалити `Неназваний': Нет такого файла или каталога
rm: не вдається видалити `документ': Нет такого файла или каталога
даже "echo -e" "отказывается" печатать перенос строки:
echo -e `ls | awk '$0 !~ /DEBIAN/ {print($0)}'`
Неназвана тека Неназваний документ

Я знаю что можно и другими способами удалить ненужное и эту команду можно переписать. Но это дело принципа разобраться почему оно не хочет работать и как его "пропихнуть"
Пока сделал так:
ls | awk '$0 !~ /DEBIAN/ {system("rm -rf \""$0"\"")}'но мне этот вариант не нравится(
« Последнее редактирование: 14 Января 2012, 19:19:55 от avi9526 »
Ubuntu 14.10

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: rm и echo не понимают строку с переносом
« Ответ #1 : 14 Января 2012, 09:05:16 »
На будущее:
export LANG=en_US.utf8
По теме:
rm DIR/!(DEBIAN)

Оффлайн avi9526

  • Автор темы
  • Активист
  • *
  • Сообщений: 618
  • ахтыжъёшкинкот
    • Просмотр профиля
    • Блог av9526
Re: rm и echo не понимают строку с переносом
« Ответ #2 : 14 Января 2012, 09:09:32 »
По теме:
rm DIR/!(DEBIAN)
Спасибо.
Но все таки, можно "присобачить" команду с "ls .. | awk .. " к echo и rm так что бы выводились строки c переносами и удалялись файлы?



Пользователь решил продолжить мысль 14 Января 2012, 09:11:54:
Можно, но это длинно и неэффективно, поэтому не нужно.
можно по-подробнее, меня интересует, так сказать?)
« Последнее редактирование: 14 Января 2012, 09:11:54 от avi9526 »
Ubuntu 14.10

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: rm и echo не понимают строку с переносом
« Ответ #3 : 14 Января 2012, 09:16:04 »
Если необходимы сообщения, то
rm -v
awk тут вообще ни к селу, ни к городу.

Оффлайн avi9526

  • Автор темы
  • Активист
  • *
  • Сообщений: 618
  • ахтыжъёшкинкот
    • Просмотр профиля
    • Блог av9526
Re: rm и echo не понимают строку с переносом
« Ответ #4 : 14 Января 2012, 09:20:39 »
Ок, попытаюсь объяснить, что я хочу)
Мне надо (приоритет = "на кону судьба человечества"), что бы по результату выполнения команды
ls | awk '$0 !~ /DEBIAN/ {print($0)}'было выведено с помощью echo строки с учетом переноса и что бы указаные файлы/папки были удалены rm.
Вопрос
1) как?
2) почему просто так не работает?
Ubuntu 14.10

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: rm и echo не понимают строку с переносом
« Ответ #5 : 14 Января 2012, 09:29:38 »
1) как?
2) почему просто так не работает?

1)
ls | awk '$0 !~ /DEBIAN/ {print($0)}' | while read ; do echo "$REPLY" ; rm "$REPLY" ; done
2) экранирование пробелов в именах

Оффлайн avi9526

  • Автор темы
  • Активист
  • *
  • Сообщений: 618
  • ахтыжъёшкинкот
    • Просмотр профиля
    • Блог av9526
Re: rm и echo не понимают строку с переносом
« Ответ #6 : 14 Января 2012, 10:57:13 »
спасибо!
еще маленький вопросик, как в
rm DIR/!(DEBIAN)кроме DEBIAN еще какое-нибудь имя указать?
Ubuntu 14.10

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: rm и echo не понимают строку с переносом
« Ответ #7 : 14 Января 2012, 11:09:49 »
Код: (bash) [Выделить]
$ echo *
Видео Документы Загрузки Изображения Музыка Общедоступные Рабочий стол Шаблоны

$ echo !(Видео|Музыка|Общедоступные|Рабочий стол)
Документы Загрузки Изображения Шаблоны

Оффлайн avi9526

  • Автор темы
  • Активист
  • *
  • Сообщений: 618
  • ахтыжъёшкинкот
    • Просмотр профиля
    • Блог av9526
Re: rm и echo не понимают строку с переносом
« Ответ #8 : 14 Января 2012, 11:16:45 »
оно в sh скрипте не работает(
Ubuntu 14.10

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net

Оффлайн avi9526

  • Автор темы
  • Активист
  • *
  • Сообщений: 618
  • ахтыжъёшкинкот
    • Просмотр профиля
    • Блог av9526
Re: rm и echo не понимают строку с переносом
« Ответ #10 : 14 Января 2012, 19:27:27 »
ls | awk '$0 !~ /DEBIAN/ {print($0)}' | while read ; do echo "$REPLY" ; rm "$REPLY" ; done
и это тоже в sh просто так не работает(
(с #!/bin/bash -i пока не совсем понятно)
в инете предлагают еще варант
http://stackoverflow.com/a/4702594
ls | awk '$0 !~ /1/ {print($0)}' | xargs -I {} echo {}но пишут что с ним тоже проблемы могут возникнуть
Цитировать
It is still wrong because ls is not meant to produce a list of files to be parsed by other tools. ls is meant to produce a user-readable list of files, and by making it user-readable, ls may substitute characters in the file names, which may cause wrong results. touch $'A file\nwith a newline' will create a file that will break your command. – Juliano Jan 15 '11 at 23:06
типа из-за того что ls предназначена не для организации таких команд, а для вывода красивого для человека списка
Вопрос:
1) На что заменить ls?
2) Как заставить эти команды работают с именами файлов содержащими перенос строки?
« Последнее редактирование: 14 Января 2012, 19:33:13 от avi9526 »
Ubuntu 14.10

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: rm и echo не понимают строку с переносом
« Ответ #11 : 14 Января 2012, 19:42:36 »
и это тоже в sh не работает(
Что значит "тоже"?

Всё работает:
Код: (bash) [Выделить]
$ cat test.sh
#!/bin/bash -i

mkdir tmp 2>/dev/null
touch tmp/{1..5}

ls -1 tmp/!(1|3|5)
ls tmp | awk '$0 !~ /1|3|5/ {print($0)}' | while read ; do ls -1 "tmp/$REPLY" ; done
ls tmp | awk '$0 !~ /1|3|5/ {print($0)}' | xargs -i ls "tmp/{}"

$ ./test.sh
tmp/2
tmp/4
tmp/2
tmp/4
tmp/2
tmp/4

Оффлайн avi9526

  • Автор темы
  • Активист
  • *
  • Сообщений: 618
  • ахтыжъёшкинкот
    • Просмотр профиля
    • Блог av9526
Re: rm и echo не понимают строку с переносом
« Ответ #12 : 14 Января 2012, 19:55:44 »
Заработало.. но имена файлов с переносом не "хавает"(
Ubuntu 14.10

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: rm и echo не понимают строку с переносом
« Ответ #13 : 14 Января 2012, 21:37:40 »
По-прежнему работает:
Код: (bash) [Выделить]
$ cat test.sh
#!/bin/bash -i

mkdir tmp 2>/dev/null
touch tmp/{"1 2","2 3","3 4","4 5","5 1"}

ls -1 tmp/!(1 2|3 4|5 1)
ls tmp | awk '$0 !~ /1 2|3 4|5 1/ {print($0)}' | while read ; do ls -1 "tmp/$REPLY" ; done
ls tmp | awk '$0 !~ /1 2|3 4|5 1/ {print($0)}' | xargs -i ls "tmp/{}"

$ ./test.sh
tmp/2 3
tmp/4 5
tmp/2 3
tmp/4 5
tmp/2 3
tmp/4 5

Оффлайн avi9526

  • Автор темы
  • Активист
  • *
  • Сообщений: 618
  • ахтыжъёшкинкот
    • Просмотр профиля
    • Блог av9526
Re: rm и echo не понимают строку с переносом
« Ответ #14 : 14 Января 2012, 21:47:13 »
не пробел, перенос стоки (\n или как его там)
Ubuntu 14.10

 

Страница сгенерирована за 0.037 секунд. Запросов: 25.