0 / 0 / 0
Регистрация: 16.02.2010
Сообщений: 4
1

Поиск каталогов, которые в себе содержат каталоги

16.02.2010, 20:19. Показов 2333. Ответов 7
Метки нет (Все метки)

Bash
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
SPATH=$1
SPATH=${SPATH:-./}
IFS=$'\n'
if [[ ! -d ${SPATH} ]]: then
echo "Katalog ne sushestvuet: '${SPATH}'"
exit 1
fi
for d in `ls -AR1p $1 | grep -e '[:]$' |sed -e 's/[:]$//' | sed -e 's[.]$//'`;
if (( `ls -A1p $d | grep -e '[^/]' | wc -l ` !=0 )): then
echo $d 
fi done
Она должна выводит имена каталогов, которые в себе содержат каталоги, но она почему-то выводит только те, которые кроме каталогов содержат и файлы.Поиск должен вестись и в скрытых, и если нет доступа, то сообщить об этом.
пример вывода:
./mc
./name
Дальше проверять каталог не надо, т.е. такого вывода быть не должно: ./home/test
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2010, 20:19
Ответы с готовыми решениями:

Вывести на экран в текущем каталоге имена тех каталогов, которые в себе не содержат подкаталогов
Здравствуйте.. Выдали данное задание на С++ под linux Разработать программу, которая выводит на...

Вывести на экран в текущем каталоге имена тех каталогов, которые в себе не содержат подкаталогов
Здравствуйте.. Выдали данное задание на С++ под linux Разработать программу, которая выводит на...

Найдите количество чисел от 0 до N, которые содержат в себе цифру n
Добрый вечер. Дано задание: Найдите количество чисел от 0 до N, которые содержат в себе цифру...

Вычислить структуры, которые содержат в себе процедуры пользователя
ребята скажите что я делаю не так вот задача: вычислить структуры ,которые содержат в себе...

7
4864 / 3286 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.02.2010, 05:18 2
Цитата Сообщение от vo_vik
но она почему-то выводит только те, которые кроме каталогов содержат и файлы
условие не исключает файлы
0
0 / 0 / 0
Регистрация: 16.02.2010
Сообщений: 4
17.02.2010, 05:54  [ТС] 3
какое конкретно условие добавить?
0
4864 / 3286 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.02.2010, 06:02 4
надо правильно сформулировать цель
то условие, которое есть сейчас, не исключает файлы
поиск каталогов, которые в себе содержат каталоги
0
0 / 0 / 0
Регистрация: 16.02.2010
Сообщений: 4
17.02.2010, 08:15  [ТС] 5
наличие файлов в каталоге не должны влиять на вывод результата, а она выводит если кроме каталога он содержит еще и файл!
0
10 / 10 / 1
Регистрация: 15.02.2010
Сообщений: 67
17.02.2010, 10:39 6
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
 
addendum ()
{
    [[ "${1:$((${#1}-1)):1}" != "/" ]] && return 1;
    return 0;
}
 
findnulldir ()
{
    for dir in "${1}"*; do
        result=0;
        text="$(ls -l "$dir")";
        echo "$text" > "./reason";
        for file in "${dir}/"*; do
            if test -d "$file"; then
                file="${file}/";
                buffer="`echo "$(ls -l "$file")"`";
                [ "$buffer" = "total 0" ] && (( result=$result + 1 )) || findnulldir "$file";
            else continue;
            fi
        done
        reason="`read ./reason`";
        buffer="total $result";
        echo "$buffer";
        [ $reason = $buffer ] && rm "./reason"; echo "$dir"; continue;
    done
}
 
pach="$1";
 
addendum "$pach";
[ $? != 0 ] && pach="${pach}/";
 
[ ! -e "$pach" ] && exit 1;
 
findnulldir "$pach";
 
exit 0
Но цикл где то застревает... Найдите причину, в случае чего разберусь как будет время...

Добавлено через 10 минут
Нашол одну оплошность...
1. между строками 15 и 16, нужно добавить строку:
Bash
1
flag=0;
2. в строке 21, между операторами "else" и "continue", нужно добавить:
Bash
1
flag=1;
3. затем, строки начиная с 24 по 27 нужно объединить в условный блок:
Bash
1
2
3
if [ flag = 0 ]; then
...
fi
Разбираемься дальше...

Добавлено через 17 минут
В третьем пункте так же имееться оплошность...
Bash
1
2
3
if [ "$flag" = "0" ]; then
...
fi
Добавлено через 16 минут
Почти работающий код:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash
 
addendum ()
{
    [[ "${1:$((${#1}-1)):1}" != "/" ]] && return 1;
    return 0;
}
 
findnulldir ()
{
    for dir in "${1}"*; do
        for file in "${dir}"*; do
            flag="0";
            if test -d "${file}"; then
                file="${file}/";
                buffer="`echo "$(ls -l "$file")"`";
                [ "$buffer" = "total 0" ] && (( result=$result + 1 )) || findnulldir "${file}";
            else flag="1"; continue;
            fi
        done
        if [ "$flag" = "0" ]; then
            echo "dir ::: $dir";
        fi
    done
}
 
pach="$1";
 
addendum "$pach";
[ $? != 0 ] && pach="${pach}/";
 
[ ! -e "$pach" ] && exit 1;
 
findnulldir "$pach";
 
exit 0
Добавлено через 8 минут
Вообщем: Пойду ка я свежим воздухом подышать...

Добавлено через 23 минуты
Подышал...
Алгоритм следующий:
1. узнаем колличество "неопределенных файлов" в определенном каталоге.
2. посредствам рекурсивного обхода - осуществляем пойск пустых каталогов.
3. если общее колличество файлов равняеться колличеству пустых каталогов в определенном каталоге, тогда выводим коталог родитель...

Все очень просто!

Если еще будет нужен код, тогда реализую немного пожже, через часиков 8.
1
0 / 0 / 0
Регистрация: 16.02.2010
Сообщений: 4
17.02.2010, 11:26  [ТС] 7
спасибо! А через grep нельзя, как я пытался? там что то проблема в последнем условии [^/]? там ^ как то странно работает, с ней он выводит 1 уровень каталога - как и надо, но только если там есть файл. а вот без ^ он выводит дерево каталога /name/dir - неправильно, но зато не обращает внимание на файлы!
0
4864 / 3286 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
18.02.2010, 03:55 8
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от vo_vik
наличие файлов в каталоге не должны влиять на вывод результата, а она выводит если кроме каталога он содержит еще и файл!
поиск каталогов, которые в себе содержат только каталоги
видимо, такое условие
когда формулируешь цель, представляй что должно получиться, а не что не должно получиться, потому что первый способ содержит один результат, а второй - неопределённое множество (второй способ приводит к тому, что ты пишешь пять скриптов - и все неправильные)

Добавлено через 21 минуту
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DirSubDir () {
    
    if [ ! -d "$1" ]; then
        return 1;
    fi;
 
    for SUBOBJ in $(ls -a1 "$1"); do
        
        #echo "$SUBOBJ";
        
        if [ ! -d "$1/$SUBOBJ" ]; then
            return 1;
        fi;
    
    done;
 
    return 0;
 
}
это для одного уровня
3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2010, 03:55
Помогаю со студенческими работами здесь

Найти и напечатать все слова, которые содержат в себе заданную букву
Дано предложение, в котором слова разделены запятой или пробелом, а общая длина <= 80. Найти и...

Подсчитать количество слов которые содержат в себе букву, введенную с клавиатуры
Дан текст. Подсчитать количество слов которые содержат в себе букву, введенную с клавиатуры.Задачу...

Строка: Вывести на экран из строки индификаторов, все индификаторы, которые не содержат в себе цифр.
#include<stdio.h> #include <stdlib.h> #include <ctype.h> #define M 21 //количество символов...

Выделить красным слова в тексте которые содержат в себе "слово"
Лаба Web-программирование Дан текст и "слово", выделить красным цветом слова в тексте которые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru