Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Поиск каталогов в котором меньше или равно заданому числу простых файлов

Мне нужно написать shell процедуру) и назрел вопрос, состоит в том что) я задаю первым параметром каталог в котором хочу произвести поиск подкаталогов но не обычный поиск а поиск каталогов в котором меньше или равно заданому числу(второй параметр) простых файлов, а потом я их удаляю эти подкаталоги и вывожу на экран сообщение о них, как мне это реализовать? я думал находить через while как-то данные подкаталоги и выполнять с ними действия уже следующие.
Ответ:
Bash
1
2
3
#!/usr/bin/env pwsh
 
gci /usr/include -dir |select @{N='Здесь файлов меньше(равно) двум';E={$_.FullName}}, @{ N='Количество';E={(gci -file $_ |measure).Count}} |where Количество -le 2
output:
Код
Здесь файлов меньше(равно) двум     Количество
------------------------------- ----------
/usr/include/architecture                2
/usr/include/bank                        1
/usr/include/c++                         0
/usr/include/corpses                     1
/usr/include/default_pager               1
/usr/include/editline                    1
/usr/include/libxml2                     0
/usr/include/malloc                      1
/usr/include/miscfs                      0
/usr/include/netkey                      1
/usr/include/php                         0
/usr/include/readline                    2
/usr/include/uuid                        1
/usr/include/vfs                         1
/usr/include/voucher                     1
/usr/include/xar                         1
Вот это загадочное выражение @{ N="Название"; E={some expression} } в терминах SQL - вычисляемый подзапрос, а в терминах powershell - вычисляемое свойство
Вопрос: Поиск каталога, который содержит определенные папки

добрый вечер.

нужно реализовать скрипт на баше,
который на входе получает путь к каталогу,
и список подкаталогов.

подкаталоги задаются через точку с запятой.

при этом, если в текущем каталоге нужные подкаталоги не обнаружены,
то поиск нужно производить на уровень выше.
то бишь, движение идет из глубины к корню.

поиск останавливается, если нужный каталог был обнаружен.
либо если по какой то причине выйти на уровень выше не удалось.


дизайн выглядит так:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#===============================================
#===============================================
 
[ $# -eq 0 ] && startDir=`pwd` || startDir=$@
clear
result=$(findRoot "$startDir" "deploy;service")
echo "[result] $result"
 
if [ "$result" != "" ]
then 
  echo "success!"
else
  echo "not found!"
fi
 
#===============================================
#===============================================
в данном случае поиск начнется в каталоге $startDir
и будет выполняться поиск каталога,
который содержит подкаталоги с именами "deploy;service"

я с башем раньше не работал.
с помощью гугла и какой то матери накидал решение.
вроде бы оно работает.

но хотелось бы узнать:
может это всё на самом деле можно сделать как то попроще?

и нет ли здесь каких то подводных камней?

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#/bin/bash
 
#===============================================
#===============================================
 
findRoot() 
{
  local maxdepth=20
  local curDirectory=`realpath -s "$1"`
  local symptoms=$(tokenizeSymptoms "$2")
 
  pushd $curDirectory 2>&1 > /dev/null
  
  while [[ $maxdepth -ne 0 && $lastDirectory != $curDirectory ]]
  do
    maxdepth=`expr $maxdepth - 1`
 
    if [ $(checkSymptoms) == "success" ]
    then
      echo $curDirectory
      return
    fi
 
    lastDirectory=$curDirectory
    cd ..
    curDirectory=$(pwd)
  done
 
  popd 2>&1 > /dev/null
 
  echo ""
}
 
#===============================================
#===============================================
 
checkSymptoms() 
{
  for symptom_ in $symptoms; do
    if [ ! -d $curDirectory/$symptom_ ]
    then
      echo "false"
      return
    fi
  done 
  echo "success"
}
 
#===============================================
#===============================================
 
#TODO: check "first second" names!
tokenizeSymptoms() 
{
  IN="$1"
 
  OIFS=$IFS
  IFS=';'
 
  arr=$IN
  for x in $arr
  do
    echo "$x"
  done
  IFS=$OIFS
}
 
#===============================================
#===============================================
 
[ $# -eq 0 ] && startDir=`pwd` || startDir=$@
clear
result=$(findRoot "$startDir" "deploy;service")
echo "[result] $result"
 
if [ "$result" != "" ]
then 
  echo "success!"
else
  echo "not found!"
fi
 
#===============================================
#===============================================
Ответ: Поправил (забыл определение функции)
Вопрос: Найти файлы содержащие определенные строки, удалить дубли строк

Добрый день, господа Линуксоиды прошу помощи с написанием shell скрипта
______________________________________

Написать shell-процедуру,которая:

в заданном первым параметром каталоге находит все простые файлы, в которых

содержатся заданные вторым или третьим параметрами символьные строки;

в найденных файлах удаляет все повторяющиеся более 2-храз строки; выводит на экран

имена всех полученных файлов.

______________________________________
PS можно псведкод, линк на статью в гугле идей нет вообще как это сделать
Ответ:
Сообщение от woodcutter23
Написать shell-процедуру,которая:
в заданном первым параметром каталоге находит все простые файлы, в которых
содержатся заданные вторым или третьим параметрами символьные строки;
я бы понял так:

Написать shell-процедуру,которая:
в заданном первым параметром каталоге находит все простые файлы, в которых
содержатся символьные строки, заданные вторым и возможными последующими параметрами;

finder { start-folder } {string} [string] [string] ...
Вопрос: Скрипт по поиску заданного слова в файлах

Написать скрипт, который подсчитывает кол-во встречаемостей заданного слова среди текстовых файлов текущего каталога. Если кол-во встречаемостей больше заданного порога, то выводится сообщение об этом. Если кол-во встречаемостей равно порогу, то создается файл с содержанием, объединяющим все текстовые файлы. Если кол-во встречаемостей меньше порога, то из каталога удаляется файл наименьшего размера.
В терминале нужно ввести ./скрипт слово порог

Bash
1
2
3
4
5
6
7
8
9
#!/bin/bash
echo $1 #Искомое слово
echo $2 #Порог встречаемости
echo "Количество текстовых файлов:"
L=$ ls *.txt | wc -l
echo $L
echo "Количество данного слова в файлах:"
A=$ find . -name "*.txt" -exec grep -o $1 '{}' \; | wc -l
echo $A
Пока остановился на том как сделать поиск только в текущем каталоге, а не во всей файловой системе. И еще, почему-то переменной А не присваивается значение. Прошу помощи)
Ответ:
Сообщение от Aer_rus
удалить файл наименьшего размера
Bash
1
rm $(ls --sort=size *.txt | tail -1)
И исправьте
Bash
7
A=$(grep -wFo $1 *.txt | wc -l)
Вопрос: Bash наименьшее кратное двух чисел

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
echo "Введите первое число"
read a
echo "Введите второе число"
read b
COUNTER=0
nu=0
while [  $COUNTER -lt 10 ]; do
    aa=$(($COUNTER % $a))
    bb=$(($COUNTER % $b))
    if ["$aa" -eq "$nu"];
        then    
            if ["$bb" -eq "$nu"];
                then    
                    echo "наименьшее кратное=$i"
                    break
                else
                    ((COUNTER++))
            fi
    fi
done
Задание: нужно найти минимальное кратное двух введенных чисел.
Выдает бесконечно такую "kod.sh: 11: kod.sh: [0: not found" ошибку.
Помогите поправить код, спасибо!

Добавлено через 1 час 20 минут
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
echo "Введите первое число"
read a
echo "Введите второе число"
read b
COUNTER=1
nu=0
while [ 1 ]; do
        aa=$(($COUNTER % $a))
        bb=$(($COUNTER % $b))
        if ["$aa" -eq "$nu"]
            then    
                if ["$bb" -eq "$nu"]
                    then    
                        echo "наименьшее кратное=$COUNTER"
                        break
                else
                    COUNTER=`expr $COUNTER + 1`
                fi
        fi
done
Прошу прощения, тот код был из "черновика". Он просто ужасен, а этот похож на рабочий но не работает(придероется к 11 строке, т.е. к 1 условию с такой "kod.sh: 11: kod.sh: [1: not found" ошибкой, P.s. kod.sh мой файл)
Помогите решить проблему, спасибо!
Ответ: 1.
Bash
1
2
3
4
5
6
if [ $a -le $b ] 
then
    nu=$a
else
    nu=$b
fi
2.
Bash
1
while [ $nu -le $(($a * $b)) ]
3.
Bash
1
nu=$((nu/$COUNTER*$((++COUNTER))))
Вопрос: Список файлов из указанного каталога и с заданным расширением записать в файл

Написать скрипт, выводящий в файл (имя файла задаётся пользователем в качестве первого аргумента командной строки) имена всех файлов с заданным расширением (третий аргумент командной строки) из заданного каталога (имя каталога задаётся пользователем в качестве второго аргумента командной строки).
 Комментарий модератора 
Давайте темам осмысленные названия
Ответ:
Сообщение от Алексей17774
Мне сложно самому дойти до этого
Сообщение от Алексей17774
самому написать не хватает мозгов и времени
А Вы уверены что правильно выбрали профессию?
Сообщение от Алексей17774
а помимо есть еще работа и семья
Не давите на жалость — толку тогда от такой учебы? Купите диплом в переходе.
Сообщение от Алексей17774
когда есть код пошагово я понимаю как он работает
скорее всего дело не в этом, а в том, что
Сообщение от Алексей17774
это нужно скоро сдавать
А дальше пойдут задания сложнее, а это все базис, а без базиса остальное вообще «китайская грамота»…
Вопрос: Удаление старых файлов из подпапок

Доброго времени суток всем.

Есть каталог /dir/, в нём множество подкаталогов с файлами.
Необходимо из всех подкаталогов удалить старые (старее 24 часов) файлы, при этом НЕ удаляя сами подкаталоги.
Пытался сделать с помощью
Bash
1
find /dir/ -mindepth 1 -print0 | xargs -n 100 -0 rm -rf
но в этом случае удаляются все подкаталоги.

Как это можно реализовать? Что я сделал не так?
Ответ: это древнее поверие, типо swap должен быть 2*ОЗУ. find давно имел ограничение на 65535 вроде файлов для обработки, а xarg нет. Поэтому из форума в форум с лохматых 90-х это и кочует. А код find за эти года давно поправили.
ЗЫ. Я тоже могу ошибаться и щас ахинею написал, но путь меня поправят, глядишь умнее стану
Вопрос: Поиск файлов в скрипте

Написать скрипт для поиска файлов заданного размера в заданном каталоге (имя каталога задаётся пользователем в качестве третьего аргумента командной строки). Диапазон (мин.- мах.) размеров файлов задаётся пользователем в качестве первого и второго аргумента командной строки.
Как реализовать диапазон, и как направить поток вывода ошибок в файл?

Добавлено через 30 минут
уже нагуглил сам
Код Bash
1
find / -size +358k -size -395k -print 2>errors.txt
Ответ: Не хочется создавать ещё одну тему, маленький вопрос, как вывести в файл значение входящего аргумента?

Добавлено через 4 минуты
уже не надо.
Вопрос: Написать скрипт поиска файлов в подпапках разными подпроцессами

Всем привет. Помогите, пожалуйста, с решением задачи, ибо надо срочно сделать, а я в bash не осень разбираюсь
Задача такая:
Для заданного каталога (аргумент 1 командной строки) и всех его подкаталогов вывести в заданный файл (аргумент 2 командной строки) и на консоль имена файлов, их размер и дату создания, удовлетворяющих заданным условиям: 1 – размер файла находится в заданных пределах от N1 до N2 (N1,N2 задаются в аргументах командной строки), 2 – дата создания находится в заданных пределах от M1 до M2 (M1,M2 задаются в аргументах командной строки). Процедура поиска для каждого подкаталога должна запускаться в отдельном процессе. Каждый процесс выводит на экран свой pid, полный путь, имя, размер просмотренного файла, общее число просмотренных файлов в подкаталоге (все в одной строке). Число запущенных процессов в любой момент времени не должно превышать N (вводится пользователем). Проверить работу программы для каталога /usr/ размер 31000 31500 дата с 01.01.1970 по текущую дату N=6.
Ответ:
Сообщение от Sentrex
прокомментировать код
Там одна команда
Bash
1
man find
Вопрос: Поиск файлов заданного размера

Написать скрипт, находящий в заданном каталоге и всех его подкаталогах все файлы заданного размера. Диапазон (мин.- мах.) размеров файлов задаётся пользователем в качестве первого и второго аргумента командной строки. Скрипт выводит результаты поиска в файл (третий аргумент командной строки) в виде: полный путь, имя файла, его размер. На консоль выводится общее число просмотренных файлов.
Помогите пожалуйста сделать
Ответ: спасибо большое