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


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Скрипт на bash  (Прочитано 622 раз)

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

Оффлайн serega006

  • Автор темы
  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Скрипт на bash
« : 28 Октябрь 2015, 18:44:01 »
Была поставлена задача написать скрипт который выводит файлы определенной папки, и если там есть папки то выводит и ее файлы и так пока все файлы не будут отображены. Был написан скрипт:
for i in `ls -1 “$1”`; do
  if [ -d $1/$i ]; then
    $0 $1/$i $2.
else echo “$2$i”
  fi
done
Работает он исправно за исключением того что если в имени файла стоит пробел то он отображает это как два отдельных файла, и как и следует ожидать в папку в имени которой содержится пробел он не зайдет, как можно это исправить? Была идея с конкатенацией имен несуществующих файлов, но реализовать её не получилось.

Оффлайн Pilot6

  • Старожил
  • *
  • Сообщений: 13658
  • Xubuntu 18.04
    • Просмотр профиля
Re: Скрипт на bash
« Ответ #1 : 28 Октябрь 2015, 18:48:33 »
В кавычки переменную с именем файла.
Я в личке не консультирую. Вопросы задавайте на форуме.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6016
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт на bash
« Ответ #2 : 28 Октябрь 2015, 19:08:32 »
Pilot6, Тут не только эта ошибка.
1. Чем Вам не нравится ls папка/*
2. Соответственно, если писать скрипт, то использовать for i in $1/*3. Что такое $2 ?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Re: Скрипт на bash
« Ответ #3 : 28 Октябрь 2015, 23:26:11 »
Все можно одной командой:
find "/path/to/dir" -type f -printf "%f\n"
*Где /path/to/dir полный путь до директории

Скриптом (безсмысленно):
*Полный путь до директории указать как параметр запуска.
Пробелы в путях и именах не вызовут ошибок.
Код: Bash
  1. #!/bin/bash
  2.  
  3. [ -d "$*" ] || { echo "Директория $* не существует."; exit 1; }
  4. IFS=$'\n'
  5. for X in $(find "$*" -type d); do
  6.         find "$X" -maxdepth 1 -mindepth 1 -type f -printf "%f\n"
  7. done
  8.  
« Последнее редактирование: 29 Октябрь 2015, 22:52:01 от Cxms »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6016
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Скрипт на bash
« Ответ #4 : 29 Октябрь 2015, 00:42:19 »
Cxms, Cудя по скрипту надо %P, a не %f
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Re: Скрипт на bash
« Ответ #5 : 29 Октябрь 2015, 23:03:32 »
Azure,
%P или %f без разницы т.к. find не переходит в поддиректории (-maxdepth 1).
А вот %p будет выводить полный путь к каждому файлу.

 

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