С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Shell, Bash
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
pgg
0 / 0 / 0
Регистрация: 25.02.2011
Сообщений: 9
1

Создание ссылок, учитывая суффикс

25.02.2011, 04:14. Просмотров 1546. Ответов 11
Метки нет (Все метки)

Здравствуйте, задали в инсте написать на shell'e скрипт, а я что-то слабо понимаю, как его реализовать, задание следующее
Создание символических ссылок для всех файлов с указанным суффиксом и числом жестких ссылок, большим 1, путем перестановки суффиксов в именах исходных файлов в начало.
Поясню, количество жестких ссылок можно посмотреть ls -l (второе поле).
Под суффиксом подразумевается концовка имени файла из определенного кол-ва символов.
Например, есть файл abcd, его суффиксами могут являться: d, cd, bcd, abcd.
Символическую ссылку можно создать командой ln -s.

В общем алгоритм более-менее понятный, нужно обработать вывод ls -l, оставить там только строки, где значение второго поля > 1, затем выкинуть дирректории из списка и проверить на суффикс каждое имя файла.

Нужна помощь, не знаю с чего начать и как конкретно это реализовать на shell'e, а сдавать уже завтра.

Спасибо заранее.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2011, 04:14
Ответы с готовыми решениями:

Создание ссылок с передачей аргументов ln
Здравствуйте. Начал недавно изучать bash и передо мной была поставлена...

Удалить неудачные фото через консоль, учитывая цвет пикселей
Друзья, подскажите, как можно получить информацию о графических файлах в...

создание списка ссылок.
всем привет возникла проблема, нужен выкидной список ссыло на HTML. Но что то...

Создание ссылок в .htaccess
У меня статичный сайт, все файлы лежет в папке index_files, я кидаю туда файл...

Создание ссылок django
есть проект на django 1.10 (только начал учиться) и вот вопрос: как реализовать...

11
accept
4833 / 3255 / 463
Регистрация: 10.12.2008
Сообщений: 10,569
25.02.2011, 05:37 2
Код
[guest@localhost tmp]$ ls -l file.txt | cut -d' ' -f 2
1
[guest@localhost tmp]$ links() { ls -l "$1" | cut -d' ' -f 2; }
[guest@localhost tmp]$ links file.txt
1
[guest@localhost tmp]$ if [ $(links file.txt) -eq 1 ]; then echo equal; fi
equal
[guest@localhost tmp]$ ln -s file.txt abc
[guest@localhost tmp]$ if [ $(links file.txt) -eq 1 ]; then echo equal; fi
equal
[guest@localhost tmp]$ rm abc
[guest@localhost tmp]$ ln file.txt abc
[guest@localhost tmp]$ if [ $(links file.txt) -eq 1 ]; then echo equal; fi
[guest@localhost tmp]$ if [ $(links file.txt) -gt 1 ]; then echo greater; fi
greater
[guest@localhost tmp]$ rm abc
[guest@localhost tmp]$ if [ $(links file.txt) -gt 1 ]; then echo greater; fi
[guest@localhost tmp]$ if [ $(links file.txt) -eq 1 ]; then echo equal; fi
equal
[guest@localhost tmp]$
Цитата Сообщение от pgg
Символическую ссылку можно создать командой ln -s.
это мягкая ссылка

Цитата Сообщение от pgg
Под суффиксом подразумевается концовка имени файла из определенного кол-ва символов.
Например, есть файл abcd, его суффиксами могут являться: d, cd, bcd, abcd.
Код
[guest@localhost tmp]$ name=abcd
[guest@localhost tmp]$ echo $name
abcd
[guest@localhost tmp]$ echo ${name:0:1}
a
[guest@localhost tmp]$ echo ${name:${#name}-1:1}
d
[guest@localhost tmp]$ echo ${name:${#name}-2:1}
c
[guest@localhost tmp]$ echo ${name:${#name}-2:2}
cd
[guest@localhost tmp]$ getsuf() { echo "${1:${#1}-$2:$2}"; }
[guest@localhost tmp]$ getsuf $name 1
d
[guest@localhost tmp]$ getsuf $name 3
bcd
[guest@localhost tmp]$ getsuf $name ${#name}
abcd
[guest@localhost tmp]$
Код
[guest@localhost tmp]$ echo $(getsuf $name 3)${name:0:${#name}-3}
bcda
[guest@localhost tmp]$ name=1234abcd
[guest@localhost tmp]$ echo $(getsuf $name 3)${name:0:${#name}-3}
bcd1234a
[guest@localhost tmp]$
1
pgg
0 / 0 / 0
Регистрация: 25.02.2011
Сообщений: 9
25.02.2011, 08:00  [ТС] 3
Спасибо, есть парочка вопросов:
1) А как построчно читать из вывода ls -l ? Мне надо прочитать скриптом все файлы в текущей директории и для каждого проверить, нужно ли создать ссылку и суффикс.
2) С механизмом суффикса не совсем понял, он будет задан как аргумент к скрипту, то есть
./example.sh bcd
где bcd - суффикс, вот надо в текущей папке найти нужные файлы, проверить на суффикс и сделать ссылки на них.
0
accept
4833 / 3255 / 463
Регистрация: 10.12.2008
Сообщений: 10,569
25.02.2011, 09:46 4
Цитата Сообщение от pgg
2) С механизмом суффикса не совсем понял, он будет задан как аргумент к скрипту, то есть
./example.sh bcd
где bcd - суффикс, вот надо в текущей папке найти нужные файлы, проверить на суффикс и сделать ссылки на них.
Код
[guest@localhost tmp]$ name=abcdef
[guest@localhost tmp]$ suf=def
[guest@localhost tmp]$ echo ${name%$suf}
abc
[guest@localhost tmp]$ if [ "${name%$suf}" == "$name" ]; then echo no suffix; else echo found suffix; fi
found suffix
[guest@localhost tmp]$ name=abcdeff
[guest@localhost tmp]$ if [ "${name%$suf}" == "$name" ]; then echo no suffix; else echo found suffix; fi
no suffix
[guest@localhost tmp]$ name=abcdeffdef
[guest@localhost tmp]$ if [ "${name%$suf}" == "$name" ]; then echo no suffix; else echo found suffix; fi
found suffix
[guest@localhost tmp]$
bcd в скрипте будет храниться в $1 (сделай echo $1 в скрипте, чтобы увидеть)

Цитата Сообщение от pgg
1) А как построчно читать из вывода ls -l ? Мне надо прочитать скриптом все файлы в текущей директории и для каждого проверить, нужно ли создать ссылку и суффикс.
Код
[guest@localhost tmp]$ echo -e "abc\ndef\nghi"
abc
def
ghi
[guest@localhost tmp]$ echo -e "abc\ndef\nghi" | for line in $(cat); do echo $line' + '$line; done
abc + abc
def + def
ghi + ghi
[guest@localhost tmp]$
как проделать с файлом что-то
можно делать прямо в цикле, что не очень удобно, так как набор действий может варьироваться и код будет расти
а можно сделать функцию и передавать файл функции, которая уже может быть глубокой, так как может вызывать другие функции
1
pgg
0 / 0 / 0
Регистрация: 25.02.2011
Сообщений: 9
26.02.2011, 02:28  [ТС] 5
Еще раз спасибо, но попробовал читать построчно и сразу получать нужные мне данные в переменные a и b и выводить их (для проверки правильности получения).
Bash
1
2
3
4
5
6
7
#!/usr/bin/env bash
ls -l | grep -v total | for line in $(cat)
do
  a=`echo $line | cut -d ' ' -f 9`
  b=`echo $line | cut -d ' ' -f 2`
  echo $a' + '$b
done
В итоге выводятся не только нужные мне поля, а вообще все, что я делаю не так?

Если без скрипта попробовать, например:
line="1 2 3 4 5"
echo $line | cut -d ' ' -f 2
то выдаст 2, как положено, а в скрипте что-то не получается

Добавлено через 6 часов 5 минут
Еще вопрос, можно ли как-то убрать выдачу размера файла из ls -l, а то если размеры разные, то получается в итоге, что поля несколько смещаются, так как в мелких файлах пробелы вместо цифр размера больших файлов. В итоге команда cut криво работает.
0
accept
4833 / 3255 / 463
Регистрация: 10.12.2008
Сообщений: 10,569
26.02.2011, 06:17 6
IFS=$'\n'; перед циклом

Код
IFS=$'\n'; for line in $(ls -l | grep -v total); do a=$(echo $line | cut -d' ' -f 9); echo $a; done
Цитата Сообщение от pgg
В итоге команда cut криво работает.
чего ?
можно получить поле, а потом его выровнять
1
pgg
0 / 0 / 0
Регистрация: 25.02.2011
Сообщений: 9
26.02.2011, 06:39  [ТС] 7
Цикл работает, спасибо.

На счет cut поясню, мы ведь указали -d ' ', Значит поля он делит по пробелу, однако таблица выровнена таким образом, что перед размером в строках, где размер составляет одну цифру, например, будет стоять 2 пробела, если есть еще строка, где размер составляет 3 цифры, например.. (не знаю как это более понятно разложить, но я пробовал cut в таком случае, поля смещаются на количество добавленных пробелов для выравнивания, проблема в том, что я не могу знать номер поля имени файла наверняка, если размер будет отображаться в таком же формате).

Вижу 2 выхода:
1) Убрать вообще размер из ls -l (но как?)
2) Сделать так, чтобы для выравнивания размера дописывались не пробелы, а нули перед размером (тоже не знаю как, может ключ есть?)

ну или посоветуйте что-то иное, если не трудно, для решения этой проблемы.
0
accept
4833 / 3255 / 463
Регистрация: 10.12.2008
Сообщений: 10,569
26.02.2011, 09:27 8
Код
[guest@localhost ~]$ echo "a  b    c" | awk '{ print $2 $1 $3 }'
bac
[guest@localhost ~]$
ещё есть stat
stat -c "%F %h %n" *
но она не входит в стандарт posix
1
pgg
0 / 0 / 0
Регистрация: 25.02.2011
Сообщений: 9
26.02.2011, 13:05  [ТС] 9
спасибо, вот, вроде как, рабочий вариант написал:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#! /usr/bin/env bash
suff="$1"
sufflen=`echo "$suff" | wc -c | awk '{print$1}'`
sufflen=`expr $sufflen - 1`
IFS=$'\n';for line in $(ls -l | grep -v "total")
do
    links=`echo "$line" | awk '{print$2}'`
    name=`echo "$line" | awk '{print$9}'`
    if [ $links -gt 1 ]
    then
        if [ "${name%$suff}" == "$name" ]
        then
            echo "$name haven't suffix"
        else
            newname=`echo $suff${name:0:${#name}-$sufflen}`
            ln -s $name $newname
            echo "$name was linked as $newname"
        fi
    else
        echo "$name not enough links"
    fi
done
0
accept
4833 / 3255 / 463
Регистрация: 10.12.2008
Сообщений: 10,569
27.02.2011, 06:15 10
Код
newname=`echo $suff${name:0:${#name}-$sufflen}`
Код
newname="$suff${name:0:${#name}-$sufflen}"
Код
sufflen=`echo "$suff" | wc -c | awk '{print$1}'`
Код
sufflen=${#suff}
haven't suffix
has no suffix
1
pgg
0 / 0 / 0
Регистрация: 25.02.2011
Сообщений: 9
27.02.2011, 09:53  [ТС] 11
Спасибо, кстати, как работают вот эти конструкции:
$suff${name:0:${#name}-$sufflen}
${name%$suff}

Вижу, что работают, но как именно не совсем понимаю.
0
accept
4833 / 3255 / 463
Регистрация: 10.12.2008
Сообщений: 10,569
28.02.2011, 02:35 12
man bash
Parameter Expansion
Код
       ${parameter:offset}
       ${parameter:offset:length}
              Substring Expansion.  Expands to  up  to  length  characters  of  parameter
              starting  at  the  character  specified  by  offset.  If length is omitted,
              expands to the substring of parameter starting at the  character  specified
              by  offset.   length  and offset are arithmetic expressions (see ARITHMETIC
              EVALUATION below).  length must evaluate to a number greater than or  equal
              to zero.  If offset evaluates to a number less than zero, the value is used
              as an offset from the end of the value of parameter.  If  parameter  is  @,
              the result is length positional parameters beginning at offset.  If parame-
              ter is an indexed array name subscripted by @  or  *,  the  result  is  the
              length  members  of the array beginning with ${parameter[offset]}.  A nega-
              tive offset is taken relative to one greater than the maximum index of  the
              specified  array.  Substring expansion applied to an associative array pro-
              duces undefined results.  Note that a negative  offset  must  be  separated
              from  the  colon  by at least one space to avoid being confused with the :-
              expansion.  Substring indexing is zero-based unless the positional  parame-
              ters  are used, in which case the indexing starts at 1 by default.  If off-
              set is 0, and the positional parameters are used, $0  is  prefixed  to  the
              list.
Код
       ${#parameter}
              Parameter  length.   The  length in characters of the value of parameter is
              substituted.  If parameter is * or @, the value substituted is  the  number
              of  positional  parameters.  If parameter is an array name subscripted by *
              or @, the value substituted is the number of elements in the array.
Код
       ${parameter%word}
       ${parameter%%word}
              Remove  matching suffix pattern.  The word is expanded to produce a pattern
              just as in pathname expansion.  If the pattern matches a  trailing  portion
              of the expanded value of parameter, then the result of the expansion is the
              expanded value of parameter with the shortest matching pattern  (the  ``%''
              case) or the longest matching pattern (the ``%%'' case) deleted.  If param-
              eter is @ or *, the pattern removal operation is applied to each positional
              parameter  in  turn, and the expansion is the resultant list.  If parameter
              is an array variable subscripted with @ or *, the pattern removal operation
              is  applied  to  each member of the array in turn, and the expansion is the
              resultant list.
1
28.02.2011, 02:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2011, 02:35

Апплет, создание ссылок
Здравствуйте. Помогите пожалуйста с добавление ссылок в бегущую строку,...

Создание реферальных ссылок
всем привет! кто нибудь сталкивался с созданием реферальных систем? в общем...

Создание символических ссылок
Есть код из книги Иванова Н. Н. "Программирование в Linux" #include <unistd.h>...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru