Странная звездочка при прерборе файлов в каталоге (скрипт на bash, выводящий ненужные символы, если каталог пустой)

Модератор: Модераторы разделов

Atheist
Сообщения: 63

Странная звездочка при прерборе файлов в каталоге

Сообщение Atheist »

Доброго времени суток!
Есть такой скрипт (ниже) - он перебирает все файлы в каталоге (кроме скрытых) и выводит их имена на экран.

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

#!/bin/bash
cd ~
for filename in *
do
    echo $filename
done

Так вот - если каталог пустой (содержит только скрытые файлы) то скрипт выводит на экран звездочку (ниже)

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

-bash-3.1$ ls -la ~
итого 28
drwx------ 4 kspus kspus 4096 Окт 11 16:16 .
drwxr-xr-x 3 root  root  4096 Июл 31 08:56 ..
-rw------- 1 kspus kspus 1258 Окт 11 15:56 .bash_history
-rw------- 1 kspus kspus   35 Сен 28 14:26 .lesshst
drwxr-xr-x 3 kspus kspus 4096 Окт 11 16:44 .mc
drwx------ 2 kspus kspus 4096 Окт 11 14:30 .ssh
-bash-3.1$
-bash-3.1$ ./test.sh
*
-bash-3.1$

Если же в директории есть любой файл (не скрытый) - то все ОК - он выводит его имя

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

-bash-3.1$ touch ~/somefile
-bash-3.1$ mkdir ~/somefilder
-bash-3.1$
-bash-3.1$ ./test.sh
somefilder
somefile
-bash-3.1$

Подскажите как мне избавиться от звездочки, если каталог пуст (может вообще какой другой способ перебора файлов в каталге использовать)?
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Странная звездочка при прерборе файлов в каталоге

Сообщение sergio »

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

for filename in $(ls); do     echo $filename; done

?

P.S.: А какого хрена там звездочка - это и мне интересно... И в просто пустом каталоге она же.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Странная звездочка при прерборе файлов в каталоге

Сообщение serzh-z »

for filename in $(ls)
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Странная звездочка при прерборе файлов в каталоге

Сообщение Uncle_Theodore »

А если написать

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

for filename in $; do echo $filename; done

то выводится значок доллара... :)

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

cd empty; for filename in $; do echo $filename; done
$

(типа, навожу на мысль... :))
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Странная звездочка при прерборе файлов в каталоге

Сообщение sergio »

Uncle_Theodore писал(а):
11.10.2007 18:37
А если написать

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

for filename in $; do echo $filename; done

то выводится значок доллара... :)

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

cd empty; for filename in $; do echo $filename; done
$

(типа, навожу на мысль... :))


Не смешно. :)
Доллар и в полном каталоге выводится. А на мысль я не навелся, промашка вышла. :)
Видимо если запрос списка файлов вернул пустоту, та шелл подстановку не делает и звездочка остается звездочкой. Вопрос - зачем оно нам?
(мрачно) Надо идти читать длинные маны...
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Atheist
Сообщения: 63

Re: Странная звездочка при прерборе файлов в каталоге

Сообщение Atheist »

Странно что такой эффект у меня возникает тока на РХ-дистрах, на СЛЕС10 к примеру звездочки нету :)
Вроде $(ls) помогает от звездочки, но еще нюанс - если имя файла содержит пробелы - то наблюдаентся вот такая картина с $(ls) - что не есть гут!!

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

#!/bin/bash
rm -rf ~/somedir
touch ~/somedir/"test file"
cd ~/somedir
for filename in *
do
    echo $filename
done
echo ----------
for filenamels in $(ls)
do
    echo $filenamels
done

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

bash-3.1$ ~/test.sh
test file
----------
test
file
bash-3.1$

Как бы победить разбивку имени на 2?
Спасибо сказали:
Atheist
Сообщения: 63

Re: Странная звездочка при прерборе файлов в каталоге

Сообщение Atheist »

Думал если сделать :
for filename in "$(ls)"
это решит проблему - фиг там:

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

 #!/bin/bash
rm -rf ~/somedir
mkdir ~/somedir
touch ~/somedir/"first file"
touch ~/somedir/"cesond file"
cd ~/somedir
for filename in *
do
    echo $filename
done
echo ----------
for filenamels in "$(ls -1)"
do
    echo $filenamels
done

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

-bash-3.1$ ./test.sh
cesond file
first file
----------
cesond file first file
-bash-3.1$
Спасибо сказали:
Atheist
Сообщения: 63

Re: Странная звездочка при прерборе файлов в каталоге

Сообщение Atheist »

остановился на таком варианте:

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

for filename in *
do
    if [ "$filename" == '*' ]; then
        continue
    fi
    echo $filename
done
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Странная звездочка при прерборе файлов в каталоге

Сообщение diesel »

вы об этом?

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

[vasiliy@beezir tmp]$ for i in *; do echo $i; done
*
[vasiliy@beezir tmp]$ for i in `ls -1`; do echo $i; done
[vasiliy@beezir tmp]$ for i in `ls -a1`; do echo $i; done
.
..
.file
[vasiliy@beezir tmp]$ for i in `ls -A1`; do echo $i; done
.file

звездочка там скорее всего потому что * заменяется шеллом на имена файлов, если замен нет, то bash оставляет все как есть:

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

[vasiliy@beezir tmp]$ ls -a
.  ..
[vasiliy@beezir tmp]$ for i in *; do echo $i; done
*



или об этом?

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

[vasiliy@beezir tmp]$ for i in $(ls -A1); do echo "filename: $i"; done
filename: .file
filename: .first
filename: file
filename: .second
filename: file
[vasiliy@beezir tmp]$ IFS='
> '
[vasiliy@beezir tmp]$ for i in $(ls -A1); do echo "filename: $i"; done
filename: .file
filename: .first file
filename: .second file
[vasiliy@beezir tmp]$ bash
[vasiliy@beezir tmp]$ ls -1A | while read i; do echo "filename: $i"; done
filename: .file
filename: .first file
filename: .second file
Спасибо сказали:
gorilych
Сообщения: 14
ОС: Debian sid

Re: Странная звездочка при прерборе файлов в каталоге

Сообщение gorilych »

Есть такой скрипт (ниже) - он перебирает все файлы в каталоге (кроме скрытых) и выводит их имена на экран


а чем плох просто
$ ls -1
?

Зачем обязательно скрипт, если такая функциональность уже есть в ls?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Странная звездочка при прерборе файлов в каталоге

Сообщение diesel »

gorilych писал(а):
18.10.2007 06:46
Есть такой скрипт (ниже) - он перебирает все файлы в каталоге (кроме скрытых) и выводит их имена на экран


а чем плох просто
$ ls -1
?

Зачем обязательно скрипт, если такая функциональность уже есть в ls?

"перебрать файлы в каталоге", обычно означает не просто вывести на терминал список файлов но еще и по возможности сделать с ними что-то полезное(смотри внимательно примеры приведенные в этом топике). echo правда для перебора все-таки не лучший вариант, да.
Спасибо сказали: