Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Открыть новую тему     Написать ответ в эту тему

digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
На всякий случай скажу, что можно условие (if) писать вне блока, чуть лаконичнее получается просто
awk '$1 > 5 {print $2}'
Ну и для такой простой конструкции не обязательно иметь gnu awk, достаточно более простого, установленного по умолчанию mawk.
Так же, это не сложно и на чистом shell'е реализовать, но конечно будет более многословно.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 18:28 15-01-2024
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
То, что было под рукой из примеров, то и вставил, привык везде if используется. Но тем не менее в скрипте заменил.
 
Очередная банальная задача. Есть txt файл после работы find с полными путями к файлу.

Код:
Например одна строка: /tmp/test/folder_in/folder1/files_1.txt  

Надо скопировать файлы, сохранив первую папку в которой находится файл.

Код:
 cp --parents /tmp/test/folder_in/folder1/files_1.txt /tmp/folder_output  

Но в этом случае получаем полный входной путь в выходной папке.
Как можно скопировать файл, чтобы получить такой формат:

Код:
  /tmp/folder_output/folder1/files_1.txt  
 
Еще нюанс - файл может быть расположен более чем за одной папкой по пути, например:
folder3/foo/files_122.txt

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 11:06 22-01-2024 | Исправлено: digital422, 12:34 22-01-2024
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть мысль разделить путь и имя файла:
 
echo /tmp/test/folder_in/folder1/folder2/files_1.txt | gawk -F "/" '{ print $NF }'
echo /tmp/test/folder_in/folder1/folder2/files_1.txt | gawk -F "/" '{NF--} 1'
 
но на второй строке "/" в пути заменяется на пробелы.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 14:17 22-01-2024 | Исправлено: digital422, 14:17 22-01-2024
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Честно, весьма запутанное объяснение, но я понял вопрос так что нужна сама папка в которой непосредственно лежит файл:
Код:
files='/tmp/test/folder_in/folder1/files_1.txt'
copy_to='/tmp/folder_output'
 
while read -r f; do
    [[ -f $f ]] || echo "WARNING: no such file: '$f'" >&2
 
    pd=$(basename "$(dirname "$f")")
    mkdir -p "$copy_to/$pd" || exit 1
    cp "$f" "$copy_to/$pd/" || exit 1
done <"$files"
(не проверял )

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 14:25 22-01-2024 | Исправлено: Alukardd, 14:27 22-01-2024
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть files.txt файл, в котором указанны ссылки на файлы после работы find, т.е. была выборка по имени, времени создания и т.д. В качестве примера привел только одну строку из этого файла:
 
/tmp/test/folder_in/folder1/files_1.txt
 
Надо из этого files.txt файла скопировать  файлы на другой сервер с сохранением структуры папок. Как писал выше, хотел разделить полный путь на 2 части, это сам путь, срезав у него начальную часть (/tmp/test) и само имя файла.
 
echo "/tmp/test/folder_in/folder1/folder2/files_1.txt" | gawk -F "/" '{NF--} 1'
но здесь "/" заменяется на пробелы.
 

Код:
 
while read p; do
    a_dir="$(echo "${p}" | gawk -F "/" '{NF--} 1'"  # - / заменяется на пробелы
    a_files="$(echo "${p}" | gawk -F "/" '{ print $NF }')"
    # new_path - добавить срез /tmp/test/folder_in (сделаю сам)
    [ -d $output_path/$a_dir ] || mkdir -p $output_path/$a_dir
    cp "${new_path}${a_dir}/$a_files" $output_path${a_dir}
done < $input_txt_files
 

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 15:13 22-01-2024 | Исправлено: digital422, 15:20 22-01-2024
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Если нужно просто всю структуру сохранить то просто вызываете rsync
rsync -aur /your/local/folder remote_server:/path/on/remote/server
Доступ должен быть с исходного на удалённый (или наоборот).

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 15:40 22-01-2024
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Нельзя всю структуру, объем большой, канал узкий, поэтому только вариант с последними измененными файлами за последний день через промежуточный txt файл. Причем этот файл формируется на основном сервере, если делать запрос с того сервера, куда будет производится копирование процесс поиска измененных файлов сильно затягивается.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 15:49 22-01-2024 | Исправлено: digital422, 15:51 22-01-2024
igor_andreev

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
но здесь "/" заменяется на пробелы

Это потому что OFS у awk по умолчанию равен пробелу.
 
Первые две папки удалить в пути: sed -r 's@/[^/]+/[^/]+@@'
 

Всего записей: 1705 | Зарегистр. 08-12-2004 | Отправлено: 16:02 22-01-2024 | Исправлено: igor_andreev, 16:03 22-01-2024
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
igor_andreev
Спасибо! gawk -F "/" '{OFS = "/"; NF--} 1'
Какой страшный sed, я по привычке, sed -e 's/\/tmp\/test//g'

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 16:55 22-01-2024
igor_andreev

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
я по привычке, sed -e 's/\/tmp\/test//g'

g(global) здесь не нужно и даже слегка опасно.  sed в этом случае удалит ВСЕ найденные /tmp/test в строке:
 
/tmp/test/bla/bla/tmp/testfolder/blabla

Всего записей: 1705 | Зарегистр. 08-12-2004 | Отправлено: 17:16 22-01-2024
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
Нельзя всю структуру, объем большой, канал узкий, поэтому только вариант с последними измененными файлами за последний день через промежуточный txt файл. Причем этот файл формируется на основном сервере, если делать запрос с того сервера, куда будет производится копирование процесс поиска измененных файлов сильно затягивается.
ну фиг знает
1. rsync достаточно хорошо и быстро сверяет что файлы не менялись и нетрогает их
2. rsync умеет принимать список файлов в include фильтре

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 18:19 22-01-2024
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
rsync не годится для данной задачи.
1. Надо передать только новые файлы, они как раз в файле и прописываются, сверка не нужна.
2. Rsync будет проверять основную базу, а это лишняя сетевая нагрузка.
3. Мой вариант скрипта задачу выполняет, структура папок с файлами сохранена.
А так, да, rsync для создания зеркальной копии применяется уже давно.
 
Следующая задача. Можно ли wput задать текстовый файл со списком файлов для upload, чтобы он не синхронизировал постоянно находящиеся файлы в папке, которые удалять нельзя. Встроенных средств для этого я не нашел, есть:
-i,  --input-file=FILE       Брать список URL-ов из файла FILE
но он с файловыми путями не работает.
 
Добавлено:
По wput отбой, нашел в wput/doc/USAGE.examples
find -cmin -10 ! -type d | wput -i - ftp://ftp.somewhere.org/

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 18:35 22-01-2024
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422

Цитата:
Надо из этого files.txt файла скопировать  файлы на другой сервер с сохранением структуры папок.

 
find ... | pax -rw куда
 
<filelest | pax -rw куда
 
путь можно отредактировать на лету с помощью pax -s - синтаксис как у sed .
 
можно использовать и tar.

Всего записей: 7731 | Зарегистр. 08-09-2001 | Отправлено: 16:37 28-01-2024
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не могу заставить ffmpeg с форматом -f segment -segment_time 01:00:00.000 заставить создавать ровные файлы с 00 минутами и секундами, все равно иногда создается файл с минусом в 1 сек, например 11:59 вместо 12:00. Причем эта ошибка возникает только в Linux сборке, в Windows файлы создаются ровные. Поэтому вариант решения остается искать имена, содержащие "-59" и переименовывать их в 00. Один из вариантов awk - split по символу "-" прибавлять единицу к часам и изменять минуты на 00. Есть другие предложения?

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 18:17 27-02-2024
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
открываем man
Цитата:
 Note that splitting may not be accurate, unless you force the reference stream key-frames at the given time. See the introductory notice and the examples below.
и смотрим ниже, как попросили
Цитата:
-force_key_frames ...

Собственно надо дописать -force_key_frames 3600,7200,10800,14400, форсим столько ключевых кадров сколько получается сегментов исходя из продолжительности видео и размера сегмента.
 
p.s. захакать имена файлов всегда, кнеч можно, но надо ли?

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 17:03 28-02-2024 | Исправлено: Alukardd, 18:15 28-02-2024
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd

Цитата:
исходя из продолжительности видео

У меня только звук, источник alsa и http, раздельные процессы, не в одном. Время создания проблемных файлов 59 минута, те файлы, которые правильные с 00 создаются так же, в 0-ю минуту. Либо программная ошибка в опции -segment_atclocktime 1, либо ntp подводит время и происходит смещение. Но тогда почему нет этой проблемы в Widows.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 18:28 28-02-2024 | Исправлено: digital422, 18:33 28-02-2024
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Не, с потоковым звуком хз, не полезу копать ffmpeg.
Если надо помочь переименовать файлы, то покидайте с пяток примеров того  как бывает не правильно и во что надо превратить.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 00:32 29-02-2024
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Я с 4 версии эту проблему пытаюсь решить, по поиску находится несколько тем, не у меня одного такая же проблема, но темы без ответов. Вчера вообще все файлы ровно создались, чудеса. Поэтому пусть скрипт правит имена. Запускается на следующий день, ищет файлы с 59 минутой и их переименовывает на 1 минуту вперед. Если есть файл "23-59.aac" то его переместить в папку текущего дня. Вот вариант, но он для каждого часа если 11 строчек можно объединить, то будет всего 2 строки. Предполагаю что возможно будет проблема, когда поменяется месяц и скрипт будет искать файлы в папке того месяца, который уже наступил.

Код:
 
MONTH=$(date +%m)
DAY=$(date +%d)
DAY_1=$(date +%d -d "1 day ago")
 
find $MONTH/$DAY_1/ -type f -name "00-59.aac" -exec mv {} $MONTH/$DAY_1/01-00.aac \;
find $MONTH/$DAY_1/ -type f -name "01-59.aac" -exec mv {} $MONTH/$DAY_1/02-00.aac \;
...
find $MONTH/$DAY_1/ -type f -name "22-59.aac" -exec mv {} $MONTH/$DAY_1/23-00.aac \;
find $MONTH/$DAY/ -type f -name "23-59.aac" -exec mv {} $MONTH/$DAY/00-00.aac \;
 


Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 10:22 02-03-2024 | Исправлено: digital422, 10:25 02-03-2024
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
А переход года не забыли учесть?)
Ну кроч в общем виде должно быть так:
я только добавил ещё папку с годом. но вы можете убрать и сделать переменную $y статичной.
+ я скрипт писал безотносительно того как сегодня день, его можно прогнать всегда на всё
Код:
#!/bin/bash
ext=aac
while read -u 9 -r f; do
    IFS=/ read -r y m d n <<<"$f"
 
    t=${n%."$ext"}
    t=${t//-/:}
 
    nf=$(TZ=UTC date "+%Y/%m/%d/%H-%M.$ext" -d "$y-$m-$d $t 1min")
 
    echo mv "$f" &#8594; "$nf"
done 9< <(find 2024/ -type f -name "*-59.$ext")
Я тут поиск начал тоже с хардкоженного текущего года. Ну и реальный mv спрятал в echo. Кроч под себя подправьте как считаете нужным.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 12:56 02-03-2024
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
По году надо будет сделать несколько условий, взять число  и месяц, если эти условия равны 01, то год считается -1, если число 01, то то месяц тоже в -1.  Надо поискать, у меня где-то скрипт работает, в котором считаются дни в месяце. И уже делать переменные Y M D исходя из этих параметров.

Цитата:
 Ну и реальный mv спрятал в echo.  

Тоже так делаю для тестирования.
&#8594; - а это что за символ ?
А строк примерно столько же, сколько и в моем одинарном случае ).

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 16:43 03-03-2024 | Исправлено: digital422, 16:47 03-03-2024
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru