find, пробелы и массив

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

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

roolebo
Сообщения: 12

find, пробелы и массив

Сообщение roolebo »

Вобщем, есть такой вот скрипт:

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

function list_subdirs () {
echo $(find "$1" -mindepth 1 -maxdepth 1 -type d -printf '%P\n')
}

#dealing with arguments
base=$(pwd)
if [ $# -eq 1 -a -d "$1" ]
then
       base="$1"
elif [ $# -gt 1 ]
then
        echo "format: incdir [DIR]"
        exit 1
fi
#show dirs with subdirs
for subdir in $(list_subdirs "$base"); do
        subsubdir=( $(list_subdirs "$subdir") )
        if [ ${#subsubdir} -ge 1 ]
        then
                echo "$subdir:${#subsubdir}"
        fi
done

В list_subdirs имя директорий с пробелами разрывается, и потом их не получается просмотреть. Попробовав разные варианты и почитав по теме где-то полдня, я так и не понял как можно обрабатывать пробелы в данном случае. Можно ли как-то исправить этот код? Или нужно было все делать по другому?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: find, пробелы и массив

Сообщение /dev/random »

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

function list_subdirs () {
        find "$1" -mindepth 1 -maxdepth 1 -type d -printf '%P\n'
}

#dealing with arguments
base=$(pwd)
if [ $# -eq 1 -a -d "$1" ]
then
       base="$1"
elif [ $# -gt 1 ]
then
        echo "format: incdir [DIR]"
        exit 1
fi
#show dirs with subdirs
list_subdirs "$base" | while read subdir; do
        subsubdir=$(list_subdirs "$subdir" | wc -l)
        if [ $subsubdir -ge 1 ]
        then
                echo "$subdir:$subsubdir"
        fi
done
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: find, пробелы и массив

Сообщение diesel »

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

 #!/bin/bash

function list_subdirs () {
     find "$1" -mindepth 1 -maxdepth 1 -type d -printf '%P\n'
}

#dealing with arguments
base=$(pwd)
if [ $# -eq 1 -a -d "$1" ]
then
       base="$1"
elif [ $# -gt 1 ]
then
        echo "format: incdir [DIR]"
        exit 1
fi
#show dirs with subdirs
IFS="
"
for subdir in $(list_subdirs "$base"); do
        subsubdir=( $(list_subdirs "$subdir") )
        if [ ${#subsubdir} -ge 1 ]
        then
                echo "$subdir:${#subsubdir}"
        fi
done
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: find, пробелы и массив

Сообщение drBatty »

roolebo писал(а):
14.02.2010 22:18
В list_subdirs имя директорий с пробелами разрывается, и потом их не получается просмотреть. Попробовав разные варианты и почитав по теме где-то полдня, я так и не понял как можно обрабатывать пробелы в данном случае. Можно ли как-то исправить этот код? Или нужно было все делать по другому?

позволю себе наглость подвести итог:
для борьбы с пробелами можно
1) читать список как /dev/random командой read, она читает построчно.
2) переправить $IFS, что-бы оболочка считала разделителем НЕ пробел (как предложил diesel )
и отсебятина
3) разделять имена символом NUL (\x00), получать find -print0, а использовать xargs -0 (так-же умеют и многие утилиты без xargs)
4) заключить имена в кавычки и отдать их командой sed
5) заэкранировать пробелы (man find про -printf)
6) заставить find саму выполнять нужную команду/скрипт
7) выкинуть нафиг find и заставить оболочку раскрывать глоббинг подстановки а команду работать только с директориями.

ну вроде и всё...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: find, пробелы и массив

Сообщение diesel »

roolebo, кстати, а что должен делать скрипт?

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

    subsubdir=$(list_subdirs "$subdir" | wc -l)

как поменял Вам /dev/random, или таки

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

  subsubdir=( $(list_subdirs "$subdir") )
  echo "$subdir:$subsubdir"


как в первоначальном варианте(эта цифра - весьма странное значение)
Если первое, то не надо этого всего:

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

find  -maxdepth 2 -mindepth 1 -type d | cut -d/ -f2 | sort | uniq -c | awk '$1>1{print $2":"$1}'
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: find, пробелы и массив

Сообщение drBatty »

diesel писал(а):
15.02.2010 01:43
как в первоначальном варианте(эта цифра - весьма странное значение)
Если первое, то не надо этого всего:

я это место тоже не понял: зачем резать имена, сортировать и т.д., если их просто считают?
ИМХО roolebo просто заменил тыщу строк своего скрипта на wc, что-бы не загромождать форум.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
roolebo
Сообщения: 12

Re: find, пробелы и массив

Сообщение roolebo »

diesel писал(а):
15.02.2010 01:43
roolebo, кстати, а что должен делать скрипт?

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

    subsubdir=$(list_subdirs "$subdir" | wc -l)

как поменял Вам /dev/random, или таки

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

  subsubdir=( $(list_subdirs "$subdir") )
  echo "$subdir:$subsubdir"

как в первоначальном варианте(эта цифра - весьма странное значение)
Если первое, то не надо этого всего:

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

find  -maxdepth 2 -mindepth 1 -type d | cut -d/ -f2 | sort | uniq -c | awk '$1>1{print $2":"$1}'

Мне подходит и то и то, поскольку цель - узнать есть ли подпапки. А предложенное вами решение превосходно, очень лакончно.
Cократил его до такого:

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

find  -maxdepth 2 -mindepth 1 -type d | cut -d/ -f2 | sort | uniq
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: find, пробелы и массив

Сообщение drBatty »

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

ls |grep "/"

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

ls | sed -n 's~/~~p'
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: find, пробелы и массив

Сообщение diesel »

roolebo писал(а):
15.02.2010 22:57
Cократил его до такого:

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

find  -maxdepth 2 -mindepth 1 -type d | cut -d/ -f2 | sort | uniq

тогда уже

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

find  -maxdepth 2 -mindepth 1 -type d | cut -d/ -f2 | sort -u

uniq -c - это на случай если надо посчитать количество совпадающих элементов
вернее даже:

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

find  -maxdepth 2 -mindepth 2 -type d | cut -d/ -f2 | sort -u

если есть папка, но в ней подпапок нет - нас ведь это не интересует.

drBatty писал(а):
15.02.2010 23:18

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

ls |grep "/"

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

ls | sed -n 's~/~~p'

это Вы к чему? :)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: find, пробелы и массив

Сообщение drBatty »

diesel писал(а):
15.02.2010 23:39
это Вы к чему?

вы можете наконец внятно сформулировать задачу? на некоторых моих каталогах результаты идентичны. вы ищите подпапки с подпапками? т.е. ./aaa/bbb/ccc подходит, а вот ./aaa/ без bbb/ уже нет? т.е.
найти все подкаталоги текущего каталога которые имеют хотя-бы один подкаталог?
(я, в отличие от вас, не телепат)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: find, пробелы и массив

Сообщение diesel »

drBatty писал(а):
16.02.2010 00:06
diesel писал(а):
15.02.2010 23:39
это Вы к чему?

вы можете наконец внятно сформулировать задачу? на некоторых моих каталогах результаты идентичны. вы ищите подпапки с подпапками? т.е. ./aaa/bbb/ccc подходит, а вот ./aaa/ без bbb/ уже нет? т.е.
найти все подкаталоги текущего каталога которые имеют хотя-бы один подкаталог?
(я, в отличие от вас, не телепат)

ага, именно так :)
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: find, пробелы и массив

Сообщение smaharbA »

с while можно огрести проблем, это другой шел
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: find, пробелы и массив

Сообщение drBatty »

diesel писал(а):
16.02.2010 12:31
найти все подкаталоги текущего каталога которые имеют хотя-бы один подкаталог?
(я, в отличие от вас, не телепат)

ага, именно так

я писать не буду за вас, сегодня спешу :)
просто смотрите:

Shell

$ ls -l / итого 88 drwxr-xr-x 2 root root 4096 2007-04-30 08:35 bin/ drwxr-xr-x 2 root root 4096 2009-11-05 21:35 boot/ drwxr-xr-x 13 root root 14500 2010-02-08 10:58 dev/ drwxr-xr-x 68 root root 12288 2010-02-16 11:45 etc/ drwxr-xr-x 11 root root 4096 2008-10-09 01:48 home/ drwxr-xr-x 5 root root 4096 2008-10-24 03:14 lib/ drwx------ 2 root root 16384 2009-11-05 21:08 lost+found/ drwxr-xr-x 16 root root 4096 2010-02-08 10:39 media/ drwxr-xr-x 16 root root 4096 2010-02-07 12:47 mnt/ drwxr-xr-x 3 root root 4096 2009-11-09 20:32 opt/ dr-xr-xr-x 142 root root 0 2010-02-08 13:36 proc/ drwx--x--- 17 root root 4096 2010-02-15 22:08 root/ drwxr-xr-x 2 root root 12288 2008-11-30 01:00 sbin/ drwxr-xr-x 2 root root 4096 2009-11-05 21:25 srv/ drwxr-xr-x 12 root root 0 2010-02-08 13:36 sys/ drwxrwxrwt 26 root root 4096 2010-02-16 15:02 tmp/ drwxr-xr-x 19 root root 4096 2010-02-02 12:49 usr/ drwxr-xr-x 22 root root 4096 2010-01-13 23:53 var/

видите цифру после прав? ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: find, пробелы и массив

Сообщение diesel »

drBatty писал(а):
16.02.2010 18:53
[видите цифру после прав? ;)

да. можно и так.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: find, пробелы и массив

Сообщение drBatty »

smaharbA писал(а):
16.02.2010 13:45
с while можно огрести проблем, это другой шел

вы про что?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: find, пробелы и массив

Сообщение smaharbA »

drBatty писал(а):
16.02.2010 19:00
smaharbA писал(а):
16.02.2010 13:45
с while можно огрести проблем, это другой шел

вы про что?



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

#!/bin/sh
a=1
echo 2 | while read; do
 a=$REPLY
done
echo $a


и

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

#!/bin/sh
a=1
echo 2 > /tmp/a
while read; do
 a=$REPLY
done < /tmp/a
echo $a



но поправимо
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: find, пробелы и массив

Сообщение drBatty »

smaharbA писал(а):
17.02.2010 12:47
но поправимо

проблемы можно огрести в любом непонятном месте. :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: find, пробелы и массив

Сообщение sgfault »

smaharbA писал(а):
17.02.2010 12:47

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

#!/bin/sh
a=1
echo 2 > /tmp/a
while read; do
 a=$REPLY
done < /tmp/a
echo $a



но поправимо

Вместо создания временного файла вручную можно использовать FIFO и process substitution:

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

#!/bin/bash
a=1
while read; do
a=$REPLY
done < <(echo 2)
echo $a
Спасибо сказали: