Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Сложение размеров файлов в BASH скрипте

Есть код для BASH скрипта который выводит размер файла, имя которого мы указали в командной строке(только первого):
Bash
1
2
3
4
5
6
#!/usr/bin/bash
if [ $1 ]; then
    find "$1" -maxdepth 1 -type f -printf "%s\n" | awk '{i+=$0} END {print i}'
else
    echo "usage: <programm> <directory>"
fi
Что нужно добавить, чтобы выводило суммарный размер нескольких перечисленных файлов?
Ответ:

Не по теме:

Сообщение от Poligonshik
чтобы выводило суммарный размер нескольких перечисленных файлов
`Два мира - два Шапиро`

pwsh: Get-Item 1.txt, 2.txt | measure length -sum

Вопрос: bash скрипт как посмотерть размер файла ls или du?

Столкнулся со странным поведением команд ls du

Дано:
Сервер FreeNAS с расшаренной папкой по SMB.
Сервер CentOS на котором запускается bash-скрипт. Он монтирует сетевую шару(которая на FreeNAS) и копирует туда архив. Затем смотрит размер файла и отправляет отчёт.

Задача:
Внутри bash-скрипта получить размер полученного архива. Или просто любого файла на сетевой шаре.

Проблема:
На CentOS руками монтирую папку и смотрю вывод команды:
root# mount -t cifs -o dom=MyDom,user=MyUser,pass=MyPass,uid=0,gid=0 //Server/BackUp /mnt/Backup
root# du -h /mnt/Backup

8,5G    /mnt/Backup/Archiv.tar.gz

Всё ожидаемо

То же самое делаю из скрипта получаю абракатабру. Вместо du поставил ls. И тогда результаты похоже на правду
#!/bin/bash
BACKUP_SIZE=`du -h "/mnt/Backup/Archiv.tar.gz" | cut -f 1`
echo "Size du:"$BACKUP_SIZE
BACKUP_SIZE=`ls -lh "/mnt/Backup/Archiv.tar.gz" | cut -f 1`
echo "Size ls:"$BACKUP_SIZE

Size du: 512
Size ls: 23K

Объясните пожалуйста как так?

bash --version
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
Ответ: vasyun,

Как страшный сон забудь такой способ бекапа, и настрой резервное копирование фринасом. Почему — объяснять мне лень, коротко: твои бекапы в опасности.
Вопрос: Реализовать Bash скрипт

Входные данные:

Две папки с файлами A и B

Выходные данные:

Пустая папка, в которой будут заложены изображения C
-----------------------------------------------------------------------

Задание

Отобрать файлы которые находятся в папке A и B , удалить один из дубликатов, а второй переместить в папку C. Одинаковыми файлами (дубликатами) можно считать те, чьи названия файлов совпадают.

Реализовать как Bash скрипт.
Структура выполнения скрипта :
removedupl [A folder adress] [B folder adress] [C folder adress]
- Пример:
./removedupl /home/students/a /home/students/b /home/students/c

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/bin/bash
 
remove_dupe(){  
 
    if [[ ! -f $1 ]]; then
 
        return
 
    fi
    if [[ ! -f $2 ]]; then
 
        return  
 
    fi
    filename="${1##*/}" 
    if [[ -f "$3/$filename" ]]; then                
        exit -1 
 
    fi
    rm $2   
    mv $1 $3
}
 
###################################
 
# Запись данных в папку A  #
 
###################################
 
i=0
 
for entry in "$1"/*
 
do
 
    filename="${entry##*/}"
 
    file_list_path_A[$i]="$entry" 
 
    filename="${filename%.*}"
 
    file_list_A[$i]="$filename" 
 
        i=$(($i+1))
 
done
 
echo -e "\nFaili mape A:\n"
 
for var in "${file_list_A[@]}"
 
do
 
    echo -e -n "$var\n"
done
 
###################################
 
# Запись данных в папку B  #
 
###################################
 
i=0
 
for entry in "$2"/*
 
do
 
    filename="${entry##*/}"
 
    file_list_path_B[$i]="$entry"
 
    filename="${filename%.*}"
 
    file_list_B[$i]="$filename"
 
    i=$(($i+1))
 
done
 
echo -e "\nFaili mape B:\n"
 
 
 
for var in "${file_list_B[@]}"
 
do
 
    echo -e -n "$var\n"
 
done
 
########################################
 
#Сравнение и удаление дубликатов #
 
########################################
 
for fileA in "${file_list_path_A[@]}"
 
do  
 
    filename_A="${fileA##*/}"   
 
    for fileB in "${file_list_path_B[@]}"   
 
    do      
 
        filename_B="${fileB##*/}"           
 
        if [ "$filename_A" = "$filename_B" ]; then                  
 
            remove_dupe $fileA $fileB $3        
 
        fi  
 
    done
 
done
 
exit 0
Ответ:
Bash
1
2
3
comm -12 <(ls "$1") <(ls "$2") |
sed ":a;\$! N;s/\n\s*/\" \"/;ta;s/^\s*\|$/\"/g;s/.*/cd \"$1\"\nmv -t \"$3\" &\ncd \"$2\"\nrm &/" | 
bash
Вопрос: Запуск команды из-под Администратора через bash скрипт

Доброго времени суток!
Возникла задача, написать bash скрипт, который бы запускался от имени пользователя, но внутри выполнял команды, которые можно выполнить только из-под root-а. Если быть точным, то мне надо просто скопировать файл командой cp.

Вот пример:
Bash
1
2
#!/bin/bash
cp record.xml /mnt/srv/
Запуск скрипта выдаёт Permission denied.
Есть предложения по реализации?
Ответ: О у Вас какая версия! Тогда покажите
Bash
1
mount.cifs --help
Вопрос: Передача и обработка stdout в bash скрипт

Добрый день! С башем работаю очень мало, пытался найти нормальнй ответ в интернете, но не смог.
Скажите пожалуйста, как можно передать в скрипт вывод переданный из другой команды:
Например у меня вызывается какая то функция и ее вывод я хочу передать в bash скрипт, в который также передаю пару переменных
Код Bash
1
 /usr/bin/konf --socket=/var/run/konfd.socket -- -d | temp.sh "include" "[0-9]{1,3}\.[0-9]{1,3}\."
Как можно работать с этим выводом в скрипте, если я сначала хочу проверить несколько условий в зависимости от переменных, а потом уже только использовать вывод и причем неоднократно
Ответ: Попробуй (если версия bash поддерживает)
Код Bash
1
showPIPE.sh <(ifconfig) "${choice}" "${~LINE}"
Если нет, надо будет сам скрипт showPIPE.sh менять
Вопрос: Bash скрипт

Разработать скрипт, который:
• выводит имя текущего каталога
• запрашивает имя пользователя
• если указанный пользователь не зарегистрирован в системе, то выводит сообщение об этом и повторно запрашивает имя пользователя
• запрашивает имя каталога
• выводит количество обычных файлов, владельцем которых является данный пользователь

Для выполнения задания используйте команды grep, find.

Сам я в Linux ни бум-бум, в bash скриптах тем более. Может кто помочь?
Ответ:
Код Bash
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
pwd
echo "Your user name:"
read user_name
until who|grep -q "$user_name";
do
    echo "Your user name:"
    read user_name;
done;
echo "Directory:"
read user_dir
find $user_dir -maxdepth 1 -user $user_name -type f | wc -l
Вопрос: Добавление bash - скрипта задачи в crontab

Как можно из bash - скрипта добавить задачу в crontab без прав root ?
Ответ: пробовал так:

Код Bash
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
 
echo "Enter minutes:"
read min;
 
su;
 
echo "DISPLAY=:0" >> /var/spool/cron/crontab/$USER
echo "$min * * * * /usr/bin/kaffeine /home/Boris/Музыка/music.mp3" >> /var/spool/cron/crontab/$USER
 
su Boris;
То есть я хотел от рута добавить, но после ввода пароля рута, скрипт как будто обрывается... то есть я останавливаюсь на том, что я остаюсь под рутом, а дальше не срабатывают команды почему то... Доходит до строчки 6 получается "su" и все...

Добавлено через 20 минут
Цитата Сообщение от Dmitry Посмотреть сообщение
и доступ в нее имеют (на запись) все юзеры, которые участвуют в группе crontab:
я командой
Код Bash
1
cat /etc/group
вывел все группы, там нету группы crontab, но заметил группу daemon, наверное в моей Linux - Fedora - это и есть crontab
Вопрос: Запуск Bash скрипта в фоне

Всем привет.
Написал небольшой Bash скрипт, который должен собирать статистику о работе пк. В скрипте функция перезапускает сама себя с минутной задержкой. Соответственно, такой скрипт должен выполняться в фоне, что у меня никак не получается сделать. Запуск с буквой & на конце ничего не даёт. Если использовать nohup, сообщения от скрипта не выводятся, но и ввод команд становится невозможен. Конкретно сообщения из скрипта выдаёт curl запрос.
Подскажите, что делать.
И заодно может кто подскажет, как этот скрипт добавить в автозагрузку?
Ответ: Добавить скрипт в /home/az/.config/autostart
Для администратора — в /etc/xdg/autostart
Вопрос: Поиск файлов в скрипте

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

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

Добавлено через 4 минуты
уже не надо.
Вопрос: Sublime Text 3 запуск bash скриптов

Всем доброго времени суток, экспериментирую с програмкой Sublime Text 3 и вот не задача, нужно мне значит запускать bash скрипты, в редакторе по умолчанию не предусмотрена функция по запуску bash скриптов я почитал манов создал файл который эту функцию добавит вот текст файла.
Code
1
2
3
4
5
6
{
   "cmd": ["./*.sh", "$file"],
   "shell": true,
   "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
   "selector": "source.sh"
}
Конечно скрипты запускаются, но если в папке лежат два скрипта то запустятся сразу два, а мне нужно чтобы запускался тот который на данный момент открыт, может знает кто, как это реализовать, помогите пожалуйста.
И последнее, написал значит я простенький скрипт
Bash
1
2
3
4
5
6
7
8
#!/bin/bash
 
echo "Введи 1"
read r
if [[ $r -eq 1 ]];
    then 
     echo "Умница"
fi
он запустился но с ошибкой
Code
1
./ttt.sh: line 4: read: read error: 0: Bad file descriptor
хотя если запускаю через терминал то все нормально, не знаете с чем может быть связано?

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