Пробелы в именах, bash (ПРобелы в именах директорий)

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

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

Аватара пользователя
crashc
Сообщения: 52
ОС: Debian 40r1-i586, etch

Пробелы в именах, bash

Сообщение crashc »

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

FIND_PATH='/home/cc/from ff/'
REGEX_NAME="*.sh"
for FLS in find $FIND_PATH -type -f -name "*.sh" #$REGEX_NAME
do
ARR_FILES=($FLS)
done


В переменной FIND_PATH в пути есть пробел, и ругается как не экранировал, как быть ?
Даже

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

cd "$FIND_PATH"

Не выходит...
*nix-way, guitar, freedom & добро и свет ;)
[ cc ] Net
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Пробелы в именах, bash

Сообщение Voice »

find "$FIND_PATH" -type -f -name

А вот это работает точно, незнаю почему у Вас с ним проблемы...
cd "$FIND_PATH"
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora

Re: Пробелы в именах, bash

Сообщение Corsair »

Попробуйте заэкранировать пробел.

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

FIND_PATH='/home/cc/from\ ff/'
Жестокий стоячий админ (с) коллега
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Пробелы в именах, bash

Сообщение diesel »

а вы до проблемы пробелов еще не добрались :)

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

diesel@gfl-1150:~$ FIND_PATH='/home/cc/from ff/'
diesel@gfl-1150:~$ for FLS in find $FIND_PATH -type -f -name "*.sh"; do echo $FLS; done
find
/home/cc/from
ff/
-type
-f
-name
*.sh



Voice писал(а):
26.12.2007 15:55
find "$FIND_PATH" -type -f -name

А вот это работает точно, незнаю почему у Вас с ним проблемы...
cd "$FIND_PATH"

и оно тоже не работает (:

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

find: invalid argument `-f' to `-type'
Спасибо сказали:
Аватара пользователя
crashc
Сообщения: 52
ОС: Debian 40r1-i586, etch

Re: Пробелы в именах, bash

Сообщение crashc »

Вот дилема так дилема :)
Я тут предположение слышал, что мол это параметры в

Не передаются...
Т.е. всегда отказываться от пробелов в nix like системах ?
*nix-way, guitar, freedom & добро и свет ;)
[ cc ] Net
Спасибо сказали:
Аватара пользователя
crashc
Сообщения: 52
ОС: Debian 40r1-i586, etch

Re: Пробелы в именах, bash

Сообщение crashc »

Хотя знаете

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

mkdir 123\ 999

Создает именно с пробелом, все тип топ... Тут имхо серьезней проблема...
И возможно баг при передаче параметров, в общем узкое место... Или я не догоню пока ;)
*nix-way, guitar, freedom & добро и свет ;)
[ cc ] Net
Спасибо сказали:
Sleeping Daemon
Сообщения: 1450

Re: Пробелы в именах, bash

Сообщение Sleeping Daemon »

crashc писал(а):
27.12.2007 06:42
Хотя знаете

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

mkdir 123\ 999

Создает именно с пробелом, все тип топ... Тут имхо серьезней проблема...
И возможно баг при передаче параметров, в общем узкое место... Или я не догоню пока ;)

man bash на предмет конструкции for.
man find.
Читать внимательно.
Спасибо сказали:
Аватара пользователя
crashc
Сообщения: 52
ОС: Debian 40r1-i586, etch

Re: Пробелы в именах, bash

Сообщение crashc »

Тоже вариант...
*nix-way, guitar, freedom & добро и свет ;)
[ cc ] Net
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: Пробелы в именах, bash

Сообщение Shura »

crashc, ты вообще неправильно используешь конструкцию for, на что тебе намекают diesel и Sleeping Daemon. Так что пока только man, а пробелы тут вообще ни при чем
Rock'n'roll мертв © БГ
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Пробелы в именах, bash

Сообщение diesel »

crashc писал(а):
27.12.2007 06:42
Хотя знаете

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

mkdir 123\ 999

Создает именно с пробелом, все тип топ... Тут имхо серьезней проблема...
И возможно баг при передаче параметров, в общем узкое место... Или я не догоню пока ;)

OK. Идем по тому что ты написал, если намек не понятен:

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

FIND_PATH='/home/cc/from ff/'
REGEX_NAME="*.sh"
for FLS in find $FIND_PATH -type -f -name "*.sh" #$REGEX_NAME
do
ARR_FILES=($FLS)
done

как я сказал выше:

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

diesel@beezir:~$ for FLS in find $FIND_PATH -type -f -name "*.sh";do echo $FLS; done
find
/home/cc/from
ff/
-type
-f
-name
*.sh

т.е. пока что стоит проблема "результаты команды не передаются в for, передается сама команда". Чтобы передавались результаты команды, нужно или взять команду в обратные кавычки, либо в конструкцию типа $(команда), на этом этапе ты можешь увидеть ошибку:

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

diesel@debian:~$ for FLS in $(find $FIND_PATH -type -f -name "*.sh");do echo $FLS; done
find: invalid argument `-f' to `-type'


(в Solaris я сообщения об ошибке не увидел, но и команда как надо не отработала):

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

diesel@debian:~$ for FLS in $(find $FIND_PATH -type f -name "*.sh");do echo $FLS; done


делаем правильно.
Вот теперь мы приходим к ошибке:

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

diesel@debian:~$ FIND_PATH="/home/diesel/dir with space";  for FLS in $(find $FIND_PATH -type f); do echo $FLS; done
find: /home/diesel/dir: No such file or directory
find: with: No such file or directory
find: space: No such file or directory


вот это уже про пробелы, берем в двойные кавычки $FIND_PATH:

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

diesel@debian:~$ FIND_PATH="/home/diesel/dir with space";  for FLS in $(find "$FIND_PATH" -type f); do echo $FLS; done
/home/diesel/dir
with
space/file
/home/diesel/dir
with
space/file
with
space


Вобщем-то работает, но не совсем так как хотелось, for считает разделителями любые разделители в т.ч. и пробелы которые у нас есть в названии директории и названиях файлов. Тут есть несколько вариантов,
1. Я пользуюсь другой конуструкцией:

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

diesel@debian:~$ FIND_PATH="/home/diesel/dir with space"; find "$FIND_PATH" -type f|while read i; do echo $i; done
/home/diesel/dir with space/file
/home/diesel/dir with space/file with space

2. В шелле можно так же выставить переменную которая определяет используемые разделители:

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

diesel@debian:~$ IFS="
"; FIND_PATH="/home/diesel/dir with space";  FPS="\n"; for FLS in $(find "$FIND_PATH" -type f); do echo $FLS; done
/home/diesel/dir with space/file
/home/diesel/dir with space/file with space

diesel@debian:~$ IFS="
"; FIND_PATH="/home/diesel/dir with space";  FPS="\n"; for FLS in $(find "$FIND_PATH" -type f); do echo $FLS; done
/home/diesel/dir with space/file
/home/diesel/dir with space/file with space
Спасибо сказали: