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

Это код для поиска и удаления файлов в определенном каталоге. Так вот вопрос в том, как сделать так, чтобы путь не прописывался в коде, а имя каталога прописывалось пользователем в командной строке.

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
#!/bin/bash
 
E_WRONG_DIRECTORY=73
 
clear # Очистка экрана.
 
TargetDirectory=/home/ubuntu/UNIXLAB3/lab4 # это путь прописанный в коде 
cd $TargetDirectory
echo "Удаление файлов в каталоге $TargetDirectory."
 
if [ "$PWD" != "$TargetDirectory" ]
then    # Защита от случайного удаления файлов не в том каталоге.
  echo "Неверный каталог!"
  echo "Переменная $PWD указывает на другой каталог!"
  exit $E_WRONG_DIRECTORY
fi
 
rm -rf * 
 
echo
echo "Конец."
echo "Файлы, из каталога $TargetDirectory, удалены."
echo
 
 
exit 0
Ответ:
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
#!/bin/bash
 
E_WRONG_DIRECTORY=73
 
clear # Очистка экрана.
 
echo -n "Enter directory: "
 
read TargetDirectory
 
#TargetDirectory=/home/ubuntu/UNIXLAB3/lab4 # это путь прописанный в коде 
cd $TargetDirectory
echo "Удаление файлов в каталоге $TargetDirectory."
 
if [ "$PWD" != "$TargetDirectory" ]
then    # Защита от случайного удаления файлов не в том каталоге.
  echo "Неверный каталог!"
  echo "Переменная $PWD указывает на другой каталог!"
  exit $E_WRONG_DIRECTORY
fi
 
rm -rf * 
 
echo
echo "Конец."
echo "Файлы, из каталога $TargetDirectory, удалены."
echo
 
 
exit 0
Вопрос: Удаление файлов, которые старше 3х дней

Здравствуйте. Помогите пожалуйста.
Нужно 2 скрипта для крона deb7:
1) удаление файлов,которые старше 3х дней.
2) помещение в архив (rar,zip, или какой либо другой формат,лишь бы процесс не сильно нагружал железо) файлов с расширением *.dem , далее удаление оригинальных файлов *.dem, которые были помещены в архив (напр. файл test.dem поместили в архив test.zip, а сам файл test.dem удалить). но так же нужно чтобы скрипт не архивировал еще не до конца записанный файл *.dem (либо добавить проверку на чтение файла другими процессами,либо не архивировать последний записанный dem файл.)

кто нибудь может помочь с данными скриптами?
Заранее спасибо.
Ответ: 1.
Код Bash
1
find . -type f -mtime +3 -delete
2.
Код Bash
1
zip -1 *.dem -x $(fuser *.dem 2>&1|cut -d: -f1)
Вопрос: Скопировать файл с удаленного сервера командой scp

Хочу скопировать файл с удаленного сервера. Могу сделать это вот так - scp user@host:/directory file . Но я хочу находится на удаленном сервере, в нужной папке. И в ней написать scp , чтобы кинуть в свою домашнюю папку. Какой для этого нужно использовать синтаксис? Подскажите как это сделать? Заранее благодарю.
Ответ:
Сообщение от Stas Risen
Marinero, судя по вашему комментарию, я так понимаю, что занимаюсь извращением?
Если в вашем дистрибутиве есть пакет sshfs,
то команда scp может оказаться лишней.
Вопрос: Права доступа на директории при чтении, изменении и удалении файлов

Всем привет , помогите разобраться с правами доступа.
У нас есть 5 директорий и 5 файлов , нужно удалить 3 и 5 директоии вместе с файлами , файл из второй директории записать в конец файла из первой , а первую первую директорию объединить с четвертой .



насколько я понимаю для всех подходит rwx, но нужно написать минимальные а знаний на это не хватает(
Ответ: Вам следует помнить, что директории — это суть файлы, со списком содержимого. При перемещении файла из одной директории в другую физического перемещения данных файла не происходит — только изменяются два списка: дир_источник и дир_получатель.
Т.е для того чтобы «файл из второй директории записать в конец файла из первой» необходимо для 1дир иметь права на запись, обеим права на вход, 2файл право на чтение, 1файл право на запись.
Вопрос: Консольная команда на удаление вложенных папок

Здравствуйте.
Имеется следующая файловая структура
    root-dir
    • dir1
      • dir1.1
        • dir1.1.1
          • file
          • file
          • file
        • dir2.2.2
          • file
          • file
          • file
        • dir3.3.3
          • file
          • file
          • file

      • dir1.2
        • dir1.1.1
          • file
          • file
          • file
        • dir2.2.2
          • file
          • file
          • file
        • dir3.3.3
          • file
          • file
          • file

      • dir1.3
        • dir1.1.1
          • file
          • file
          • file
        • dir2.2.2
          • file
          • file
          • file
        • dir3.3.3
          • file
          • file
          • file

    • dir2
      • dir2.1
        • dir1.1.1
          • file
          • file
          • file
        • dir2.2.2
          • file
          • file
          • file
        • dir3.3.3
          • file
          • file
          • file

      • dir2.2
        • dir1.1.1
          • file
          • file
          • file
        • dir2.2.2
          • file
          • file
          • file
        • dir3.3.3
          • file
          • file
          • file

      • dir2.3
        • dir1.1.1
          • file
          • file
          • file
        • dir2.2.2
          • file
          • file
          • file
        • dir3.3.3
          • file
          • file
          • file
    • dir3
      • dir3.1
        • dir1.1.1
          • file
          • file
          • file
        • dir2.2.2
          • file
          • file
          • file
        • dir3.3.3
          • file
          • file
          • file

      • dir3.2
        • dir1.1.1
          • file
          • file
          • file
        • dir2.2.2
          • file
          • file
          • file
        • dir3.3.3
          • file
          • file
          • file

      • dir3.3
        • dir1.1.1
          • file
          • file
          • file
        • dir2.2.2
          • file
          • file
          • file
        • dir3.3.3
          • file
          • file
          • file

Всего около полутора тысяч папок и около пятидесяти тысяч бинарных файлов.
Подскажите, возможно ли как то удалить консольной командой все вложенные папки переместив файлы из этих папок в корневую папку?
Заранее спасибо!
Ответ:
Команда осуществит поиск файлов по директории root_dir + вложенным директориям и переместит найденные файлы в папку backup.
Вопрос: Занять файл процессом

Салют!
Тестирую удаление файлов в программе. Нужно сымитировать с помощью скрипта попытку удаления файла, который в данный момент кем-то занят и, следовательно, не может быть удален. Как занять файл средствами bash? Я думал открывать файл в vi или mcedit в фоновом режиме, но окна программ и в одном и в другом все равно запускаются. Это мне не нужно. Конечно есть еще вариант написать небольшую программку на С++, которая бы занимала файл, но все таки хотелось бы обойтись стандартными средствами.
Ответ: gng, спасибо большое. Напишу скорее всего свою программку. Так надежнее.
Вопрос: Не работает команда отправки почтового сообщения

Коллеги, добрый день!
Помогите, пожалуйста, начинающему скриптописателю.
Итак: Linux CentOS 6, bash

Ниже скрипт:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
!#/bin/bash
STDIN=$(cat -) #Скрипт получает параметры из потока.
 
#Далее, он полученные из потока данные УСПЕШНО обрабатывает!
SRCMAIL=$(echo $STDIN | sed -n '{s/.*From: //p}' | awk ' {print $1} ')
DSTMAIL=$(echo $STDIN | sed -n '{s/.*To: //p}' | awk ' {print $1} ')
BODYMAIL=$(echo $STDIN | sed -n '{s/.*base64 //p}' | awk ' {print $1} ')
 
#Успешный результат обработанных данных
echo $SRCMAIL >> /tmp/tempscript
echo $DSTMAIL >> /tmp/tempscript
echo $BODYMAIL >> /tmp/tempscript
 
#И теперь команда, которая просто тупо отправляет письмо в файл. Он не зависит от работы команд выше, так как не получает от них входных данных.
/bin/mail -s 'Subject' -F /var/tmp/messages/message01 [email]pupkin@domain.com[/email] <<< 'Hello world!!!'
Так в чем проблема: если сделать скрипт только из этой команды, то все прекрасно отрабатывает, сообщение кладется в файл. Но если присутствуют команды выше, то команда не работает. Письма не получаю, вывода тоже.
В чем может быть проблема?
Ответ: nezabudka, спасибо за ответ. Я разобрался. Здесь проблемы была не в этом. Когда я запускал скрипт "руками", я запускал от рута. А когда не работало, скрипт запускался приложением, а приложение его запускало от обычного пользователя. так, чтобы заработало, нужно было файлу, куда он складывает письма, изменить, как вариант, владельца, поставить пользователя, от имени которого запускается скрипт.
Вопрос: Собрать информацию в файл с 50 серверов

Здравствуйте!
Новичек!
Прошу помочь допилить скрипт.
Задача - собрать информацию с удаленных серверов в один файл (df -h, uptime, lsb_release и т.д.).
В файле aliases 50 строк названий и ip адресов серверов.

Код Bash
1
2
3
4
5
6
7
8
9
10
11
12
dir=/media/info/;
if [ ! -d "$dir" ];
then mkdir -p $dir;
fi;
while read line;
    do
    nchr=`expr index "$line" ' '`
    alias=${line:0:$nchr-1}
    ip=${line:$nchr:`expr length "$line"`}
        ssh root@"$ip" ' uptime > /media/'"$alias"'.txt | exit ';
        scp [email]root@"$ip":/media/"$alias"'.txt[/email]' $dir;
    done <aliases
Цикл отрабатывает только один раз, так как после подключения к удаленному серверу, скрипт не находит файл aliases, т.е. команда exit не отрабатывает, пробовал logout результат одинаковый.
Тэг [email] - самостоятельно проставляется.
Ответ: Немного и оказывается это известный баг. Тут используется перенаправление ввода (<"/media/aliases"), который и считывает while. Однако, некоторые команды, типо ssh, cat и т.д. тоже его считывают, так что уже ничего для while не остаётся. Методов решения как всегда несколько:
1. "Заткнуть пасть" команде чем-нибудь другим, что она не "доедала" стандартный ввод: ssh ... </dev/null
2. Перенаправить ввод строк через другой дескриптор: while read -u9 ... done 9<"/media/aliases"
3. Использовать опции самой программы, если такие есть: ssh -n ...
Код Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
 
dir=~/media/info/
if [ ! -d "$dir" ]
then
    mkdir -p $dir
fi
 
while read srv_name srv_ip
do
    echo "$(date --rfc-3339=seconds) $srv_name"
    ssh -n root@"$srv_ip" 'uptime ; lsb_release -d' 
done <"/full/path/aliases" >"/media/info"
Вопрос: Запуск, удаление файлов в Lubuntu!

Здравствуйте, уважаемые!

Поставил Lubuntu на ноут, которое уже многое повидал и требует минимальной загрузки от системы, задача - сделать юзерфрендли для обычного юзера, которому нет времени копаться в командной строке.

САм для установки и удаления до сего дня использовал командную строку.

Вопрос: какой путь наиболее простой для того, чтобы простой пользователь мог без коммандной строки постоянно запускать файлы, создавать папки и, соответственно, удалять файлы и папки (хотел бы увидеть все возможные варианты, желательно без того, чтобы постоянно приходилось прописывать chmod -R 777, сам эту фичу никогда не использовал).

Добавлено через 24 минуты
дополнение к вопросу - как простому юзверю инсталлировать и удалять проги без следов (кроме метода создания сборки с последующим удалением пакаджа =))
Ответ:

Не по теме:

lamaundercover, совет: "Перестаньте шокировать/смешить народ безумными идеями. Изложите основную задачу Ваших эезерсисов: возможно Вам предложат более простой и «прямой» путь её достижения"

Вопрос: Как отправить все файлы которые лежат в папке по tftp через bash скрипт

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
#/bin/bash
function directory
{
  for infile in $1/*
  do
    if [ -d "$infile" ]; then
      directory "$infile"
    else
      tftp "$infile"
    fi
  done
}
 
function tftp
{
    echo ${1:26};
       #какую нужно написать команду здесь для отправки файла?
}
 
for infile in /var/www/testing/*; 
do
  if [ -d "$infile" ]; then
    directory "$infile"
  else
    tftp "$infile"
  fi
done
Ответ: Что у меня получилось

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
#/bin/bash
#Адрес устройства по которому нужно отправить файлы
host_name="192.168.2.2"
#Место расположения директории
folder="/var/www/test" 
#Количество символов которые используются в пути до директории
folderLength=${#folder}
 
function directory
{
  for infile in $1/*
  do
    cd ${infile%/*}
    if [ -d "$infile" ]; then
      directory "$infile"
    else
      tftp "$infile"
    fi
  done
}
 
function tftp
{
  filename=${1:$folderLength}
 
  echo $1
 
  expect -c "spawn tftp $host_name;
  expect "tftp>";
  send "binary\r";
  expect "tftp>";
  send "put $filename\r";
  expect "tftp>";
  send "quit\r";
  "
 
  #clear
}
 
for infile in $folder*; 
do
  cd ${infile%/*}
  if [ -d "$infile" ]; then
    directory "$infile"
  else
    tftp "$infile"
  fi
done

Нету отслеживания Error code.