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

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

Например так: перемещается файл file.txt, но в папке назначения он уже есть, поэтому он будет перемещён с именем file_2.txt.
Ответ: Спасибо, nezabudka. Думал, что есть более простой встроенный метод. Но если нет, то сделал так:
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
#!/usr/bin/env bash
 
src=~/temp/src
dst=~/temp/dst
 
IFS=$'\n'
 
for file in $(find $src -type f -name "*"); do
    filename=$(basename $file)  
    ext="${filename##*.}"
    bare_filename="${filename%.*}"
    newfile="$dst/$filename"
    
    idx=1
    while [[ -f $newfile ]]
    do
        ((idx++))
        prefix="($idx)"
        newfile="$dst/$bare_filename$prefix.$ext"
    done
    
    mv $file $newfile
    echo "Файл '$file' перемещён в '$newfile'"
done
Вопрос: Проблема с загрузкой файлов Debian 8/Apache 2/PHP 5

Добрый день,

столкнулся с проблемой загрузки файлов на только что установленной системе Debian 3.16.7-ckt25-1 (2016-03-06) x86_64 / Apache/2.4.10 / PHP 5.6.19-0+deb8u1

фрагмент /etc/php5/apache2/php.ini

;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

; Whether to allow HTTP file uploads.
; http://php.net/file-uploads
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
;upload_tmp_dir =


настройки виртуального хоста

<VirtualHost IP:80>
	ServerName mydomain.ru
	ServerAlias www.mydomain.ru
	ServerAdmin support@mydomain.ru

	AddDefaultCharset UTF-8

	DocumentRoot /var/www/user/data/sites/mydomain.ru/www
	CustomLog /var/www/user/data/sites/mydomain.ru/logs/mydomain.ru.access.log combined
	ErrorLog /var/www/user/data/sites/mydomain.ru/logs/mydomain.ru.error.log

	AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
	AddType application/x-httpd-php-source .phps

	php_admin_value open_basedir "/var/www/user/data/:."
	php_admin_value upload_tmp_dir "/var/www/user/data/sites/mydomain.ru/tmp"
	php_admin_value session.save_path "/var/www/user/data/sites/mydomain.ru/tmp"
</VirtualHost>

<Directory /var/www/user/data/sites/mydomain.ru/www>
	AllowOverride All
	Options -ExecCGI -Includes -Indexes
	php_admin_value open_basedir "/var/www/user/data/:."
	php_admin_flag engine on
</Directory>


При попытке загрузить файлы на сервер получаю ошибку:

PHP Warning:  Unknown: open_basedir restriction in effect. File(/tmp) is not within the allowed path(s): (/var/www/user/data/:.) in Unknown on line 0
PHP Warning:  File upload error - unable to create a temporary file in Unknown on line 0


т.е., насколько я понимаю происходит следующее, поскольку в php.ini не указана директива "upload_tmp_dir", то путь к папке для загрузки файлов берётся системный, т.е. "/tmp", НО, из файла конфигурации виртуального хоста берётся директива базовой директории "open_basedir", работа за пределами которой для данного виртуального хоста запрещена, о чём, собственно, и говорится в сообщении об ошибке. Вопрос, почему игнорируется директива "upload_tmp_dir" для виртуального хоста?
Ответ: Проблема решена, хост работал на SSL, соответственно директивы указания на папку для загружаемых файлов надо было указывать в соответствующем конфиге.
Вопрос: Скрипт с получением имени владельца файла

Все привет!

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

Проблема с 3 пунктом. Нашел только вот такое: Верно, если файл с именем file существует и его владельцем является пользователь, на которого указывает эффективный идентификатор пользователя "-G file".
Как я понял, он сравнивает текущего пользователя/или пользователя, который запустил текущий процесс.
Каким образом можно сделать сравнение любого пользователя системы с владельцем файла? Прошу у Вас помощи!

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
echo "Текущий каталог:"
pwd
a=0
b=0
path=/home/maks/
while [ $b -lt 1 ]
do
b=$a
echo "Введите имя файла:"
read name
if [ ! -f $path/$name ]
then echo "Файл не найден.Повторить?(y/n)"
read yn
if [ $yn = y ]
then
continue
else echo "Завершение программы"
fi
fi
if [ -G $name ]
then echo ""
else echo "2:"
ls -l $name
fi
b=$(( b + 1 ))
done
Ответ: Есть задание:
Разработать скрипт, который:
- выводит имя текущего каталога
- запрашивает имя файла
- если файл не существует, выводит сообщение об ошибке и снова запрашивает имя файла
- запрашивает имя пользователя
- если пользователь не является владельцем файла, то выводит имя владельца файла и имя группы файла.
Смог сделать все до момента сравнивания имени пользователя с именем владельца файла, тут возникает проблема, как вытащить имя этого владельца из ls.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
pwd
echo "Введите имя файла:"
while true; do
read file1
echo "Поиск по имени файла $file1"
find . -name $file1
if [ -a $file1 ] ; then
echo "Файл найден"
pwd $file1
break
else
echo "Файл не найден.Повторите ввод"
fi
done
 
echo "Введите имя пользователя:"
read user
Заранее спасибо за помощь.
Вопрос: Как создать список и записать в файл

find -type f -iname '*.dat*'

Как создать файл и записать в файл полный путь всех файлов с расширением *dat, кроме файлов с расширением DONE
Ответ: find "$(pwd -P)" -type f -iname '*.dat*' -not -iname '*.DONE'


а проще нельзя?
find "$(pwd -P)" -type f -iname '*.dat'
Вопрос: Замена слов в файле, используя утилиту - sed

Есть необходимость менять слова в файлах

Утилита sed позволяет это сделать так

Bash
1
sed s/ОБРАЗЕЦ/ЗАМЕНА/
Вот сценарий

Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
 echo -e  " По утрам он делал зарядку.\r
 Молния - электрический заряд." > zar.txt
 cat ./zar.txt
 
# sed 's/заряд/разряд/' < ./zar.txt > ./zar.txt
 sed 's/заряд/разряд/' zar.txt


Но в итоге конечный файл не меняется.

Подскажите пожалуйста как разрешить данную ситуацию ?

Как написать образец если нужно изменить сразу несколько слов или вообще предложений?

Написать для каждого слова в отдельной строке команду ?

Добавлено через 28 минут
Вернее файл меняется, но меняется найденное первое совпадение.

Если указать

Bash
1
 sed 's/заряд/разряд/g' ./zar.txt
То поиск и замена будет по всему тексту

Но почему он не делает строго по шаблону и меняет , в данном случае, и другие слова, например слово зарядка поменял на разрядка ?

Добавлено через 25 минут
А вот в данном примере изменения выводятся только на экран, но сам файл не изменяется, почему это может быть?

Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
echo -e "[share]" > ./smb-edit.conf
echo -e "\tcomment = Ubuntu File Server Share\r
    \tpath = /home/alex/samba/share\r
    \tbrowsable = yes\r
    \tguest ok = yes\r
    \tread only = no\r
    \tcreate mask = 0756
    \tcreate mask2 = 0756
    
    " > /home/alex/scripts/tmp/smb-edit.conf
 
sed  "s/\tcreate mask = 0756/\tcreate mask = 0000/" ./smb-edit.conf
 
gedit ./smb-edit.conf


В предыдущем примере так же... не изменяется конечный файл.

Sed не меняет данные в обрабатываемом файле. Редактор читает файл, обрабатывает прочитанное, и отправляет то, что получилось, в STDOUT.
При необходимости вывод sed можно перенаправить в файл, возможно — перезаписать старый файл.
Как перенаправить вывод в этот же файл и перезаписать найденную строчку?

Добавлено через 1 час 49 минут
Разобрался с ответом на один из своих вопросов :

Сообщение от masli
Как написать образец если нужно изменить сразу несколько слов или вообще предложений?
Написать для каждого слова в отдельной строке команду ?
Для выполнения нескольких действий с данными, используйте ключ -e при вызове sed.
Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
echo -e "[share]" > ./smb-edit.conf
echo -e "\tcomment = Ubuntu File Server Share\r
    \tpath = /home/alex/samba/share\r
    \tbrowsable = yes\r
    \tguest ok = yes\r
    \tread only = no\r
    \tcreate mask = 0756
    \tcreate mask2 = 0756
    
    " > /home/alex/scripts/tmp/smb-edit.conf
    
    cat ./smb-edit.conf
    pause
 
sed -e  "s/\tcreate mask = 0756/\tcreate mask = 0000/; s/\tguest ok = yes/\tguest ok = no/"  ./smb-edit.conf
 
sed -e  "s:\tcreate mask = 0756:\tcreate mask = 1111:; s:\tguest ok = yes:\tguest ok = NO:"  ./smb-edit.conf


Остается только вопрос о непосредственном изменении самого файла.

И изменение точно заданного шаблона.
Ответ: Все работает.

Вот полное решение, с комментариями (как я это понимаю)

Кликните здесь для просмотра всего текста
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
#!/usr/bin/env bash
function pause(){
   echo
   #read -p "$*"
   #m="Нажмите любую клавишу или подождите 3 секунды для продолжения..."
   m="Нажмите любую клавишу для продолжения..."
   # read -n 1 -t 3 -p "$m"
   read -n 1 -p "$m"
   echo
}
 
title (){
echo
echo -e "---------------- $1 ----------------\n"
}
mes (){
echo -e "$1  \n" 
}
echo -e "[Share]\r
\tcomment = Ubuntu File Server Share\r
\tpath = /home/alex/samba/share\r
\tbrowsable = yes\r
\tguest ok = yes\r
\tread only = no\r
\tcreate mask = 0756
\tcreate mask = 0000 " > ./smb-edit-2.conf
pause
 sed -r --in-place=.bak -e   "/^\s*create mask = /s/\S*\s*$/0000/
 /^\s*guest ok = /s/yes/no/" ./smb-edit-2.conf
 
 # /\S*\s*$/ - образец для поиска
# \S - не пробельный символ
# * - любое количество символов в строке
 # S* - любое количество не пробельных символов (то есть любых символов, кроме пробела) в строке
# s* - любое количество символа "пробел"
 
# -e - добавление скрипта или regex в исполняемые команды
# -r - использовать расширенный синтаксис регулярных выражений
# (спец символы активны по умолчанию)
               
 # ^ - данный символ означает начало строки, 
# но иногда, в зависимости от контекста, означает 
# отрицание в регулярных выражениях
# Сам символ слэш '/', хотя и не является специальными символом 
# в регулярных выражениях, но открывает-закрывает regexp в синтаксисе 
# /...pattern.../
# \S , где - не пробельный символ
# Звездочка -- * -- означает любое количество символов в строке, 
# предшествующих "звездочке", в том числе и нулевое число символов.
# то есть любое количество не пробельных символов
# Знак доллара -- $ -- в конце регулярного выражения соответствует концу строки.
# /^\tcreate mask = / - шаблон поиска
# s/\S*$/0000/, где 
# /\S*$/ - /образец/
# /0000/ - /замена/
# между предложениями можно не ставить точку символ ';' 
# если другое предложение переноситься на новую строку
 
 # -i[SUFFIX], --in-place[=SUFFIX]
 # редактировать файлы на месте (делает резервное копирование, если указан суффикс)


Решено.
Вопрос: Не могу назначить индексный файл index.php

В корневой папке сайта лежит файл index.php который генерирует главную страничку.
Если я захожу по адресу: www.site.ru/index.php - все ок.

Задача состоит в том, чтобы при заходе на главную страницу сайта www.site.ru (в адресе только домен, без index.php) появлялась страница сгенерированая файлом index.php.
Так же перед этим нужно проверить не лежит ли рядом файл index.html и если лежит, то отдать его.

Если в корень положить index.html - то www.site.ru отдает статичный файл index.html как надо.

В общем проблема только в index.php

Вот мой файл конфигурации:
server {
	listen 80;
	server_name site.ru www.site.ru;
	index index.html index.php;

	location / {
		index index.html index.php;
		root /home/site.ru/www;
		try_files $uri /index.html @rewrite;
	}

	location @rewrite {
		index index.html index.php;
		rewrite ^/(.*).html$ /article.php?link=$1;
		rewrite ^/print/([a-zA-Z0-9_-]+).html$ /article.php?link=$1&print=true;
	}

	location ~ \.php$ {
		index index.html index.php;
		root /home/site.ru/www;
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME /home/site.ru/www$fastcgi_script_name;
		include /etc/nginx/fastcgi_params;
	}
}

Пожалуйста, подскажите что я делаю не так ?
Спасибо !
Ответ:
Dimitry Sibiryakov
Степан Речной
почему нет ?

Потому что ты ей сказал переписать url как www.site.ru/article.php?title=index


Неужели у этой элементарной задачи нет решения? Мне совершенно ничего не приходит в голову. try_files я убрать не могу, это основа - отдаем статику, если ее нет то передаем на обработку php. Я уверен что многие сайты функционируют по такому принципу, если возможно подскажите как реализовать по другому ?

Еще раз. Все чего я хочу добиться это:
Сначала статика, если ее нет - динамика. Это касается и индексных файлов.

Спасибо!
Вопрос: Получить capabilities файлов папки

Собственно, как получить их в формате 0х0, 0х400 и тд?
Использовать getcap? Если да, то напишите пример использования, а то прочитав манил по нему - не понял ничего.
Ответ: Вы бредите? При чем здесь процессы к
Сообщение от blackeangel
capabilities файлов папки
Повторю
Сообщение от Marinero
для чего это Вам надо?
Или давайте угадывать: речь про права доступа?
Вопрос: Выделение файлов с определенным расширением файла

Работаю в эмуляторе линукс. Может кто знает как подсветить файлы с определенным расширением, например файлы .java. Т.е. сейчас выглядит содержимое папки lab2 следующим образом:

anovik@sigma:~/oop/lab2
→ ls
MacierzInt.class Skladnik.java
MacierzInt.java SkladnikTest.class
Rzutowania.class UlamekTest.class WektorInt.class
Rzutowania.java UlamekTest.java WektorInt.java


Возможно ли как-нибуд сделать следующим образом?

anovik@sigma:~/oop/lab2
→ ls
MacierzInt.class Skladnik.java
MacierzInt.java SkladnikTest.class
Rzutowania.class UlamekTest.class WektorInt.class
Rzutowania.java UlamekTest.java WektorInt.java

Ответ: LS_COLORS?

вот тут даже онлайн-генератор строки для этой переменной есть:
Вопрос: Конвертирование файлов

Всем добра!
Вообщем, понадобилось мне переконвертировать много *.svg файлов в *.pdf, чтобы latex смог понять это.
конвертирование одного файла будет примерно так (конвертирует image.svg в image.pdf)
Код Bash
1
inkscape -D -z --file=image.svg --export-pdf=image.pdf --export-latex
но каждый раз менять аргумент для каждого файла как-то не очень впечатляет, т.к. впечатляет количество *.svg файлов
Как сделать небольшой скрипт, который переберёт все *.svg файлы в директории и переконвертирует их в *.pdf файлы? Причём имя *.pdf файла должно соответсвовать имени *.svg файла.

Буду премного благодарен за решение

Добавлено через 1 час 46 минут
уже не актуально, сам разобрался
если кому надо
Код Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
 
for svg_file_name in *
do
  echo "$svg_file_name" | grep -q "svg$"
  
  if [ $? -eq 0 ]
  then
    current_file_name=`echo $svg_file_name | sed 's/....$//'`
    current_dir_name=`echo $current_file_name"_latexdir"`
    mkdir $current_dir_name
    inkscape -D -z --file=$current_file_name.svg --export-pdf=$current_dir_name/$current_file_name.pdf --export-latex
  fi
done
Ответ: Вставлю свои три копейки. Приведены правильные решения, но не до конца соответсвуют постановке задачи.
Сообщение от S9
т.к. впечатляет количество *.svg файлов
при том, что командная строка ограничена в зависимости от дистра примерно в пределах от 100K до 5M символов
Код Bash
1
getconf ARG_MAX
Имена файлов, заполненные по *, или *.svg могут туда и не вместиться. Используют обычно xargs или find ... -exec, или что-то типа:
Код Bash
1
find . -maxdepth 1 -name "*.svg" | while read $f; do inkscape -D -z --file="$f" --export-pdf="${f%.svg}.pdf" --export-latex; done
Добавлено через 2 часа 36 минут
PS. Проверил. Моё предупреждение в данном случае оказалось неуместным. Для большого кол-ва файлов
Код Bash
1
2
$ ls *
bash: /bin/ls: Argument list too long
Но
Код Bash
1
$ for f in *; do echo $f; 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
#!/bin/bash
echo "Введите имя файла"
if if [ -z $1 ]; then
  echo "Вы не указали обрабатываемый файл."
   exit 0
fi
echo "Введите Каталог"
if if [ -z $2 ]; then
  echo "Вы не указали Каталог."
   exit 0
   fi
   echo "Введите тип файла"
if if [ -z $3 ]; then
  echo "Вы не указали тип файла."
   exit 0
   fi
   echo "Введите сколько времени прошёл с изменения данного файла в днях"
if if [ -z $4 ]; then
  echo "Вы не указали сколько времени прошёл с изменения данного файла в днях"
   exit 0
   fi
   
   
FileName=$1;
Catalog = $2;
TypeFile=$3;
for file in `find $Catalog ( -name $FileName -o -name $TypeFile ) ~ -mtime $4 -daystart`
do
echo $file
done
Ответ: В целом так, только
Сообщение от Marinero
Тип файла не тестируется через -name