1

тут попросили.
этот скрипт делает хардлинки (вторые имена) на файлы, и если они слишком длинные их обрезает, например

 Консоль:

$ ~/scripts/msdos_name ../TARGET
./x/y2/aaaaaaaaaaaaaaaaaaaaaa1.ext
mkdir: создан каталог «../TARGET/x/y2»
«../TARGET/x/y2/aaaaaaa~.ext» => «./x/y2/aaaaaaaaaaaaaaaaaaaaaa1.ext»
./x/y2/aaaaaaaaaaaaaaaaaaaaaa3.ext
«../TARGET/x/y2/aaaaaa~1.ext» => «./x/y2/aaaaaaaaaaaaaaaaaaaaaa3.ext»
./x/y2/aa  aaaaa  aaaaaaaa   aaaa aaa.ext
«../TARGET/x/y2/aa__aaa~.ext» => «./x/y2/aa  aaaaa  aaaaaaaa   aaaa aaa.ext»
./x/y2/f3
«../TARGET/x/y2/f3» => «./x/y2/f3»
./x/y2/aaaaaaaaaaaaaaaaaaaaaa2.ext
«../TARGET/x/y2/aaaaaa~2.ext» => «./x/y2/aaaaaaaaaaaaaaaaaaaaaa2.ext»
./x/y2/aaaaaaaaaaaaaaaaaaaaaa.ext
«../TARGET/x/y2/aaaaaa~3.ext» => «./x/y2/aaaaaaaaaaaaaaaaaaaaaa.ext»


#!/bin/bash

TARGET="$1"

if [ -z "$TARGET" ]; then
    cat <<EOT
Использование: `basename $0` TARGET
Создание хардлинков на файлы в CWD.
Хардлинки обрезаются по маздайным правилам.
EOT
    exit 70
fi

if [ ! -d "$TARGET" ]; then
    mkdir --parents "$TARGET"
    err=$?
    if [ $err != 0 ]; then
        exit $err
    fi
fi

find . -type f |\
    while read FILE; do
        echo "$FILE"
        DIRNAME=`dirname "$FILE"`
        DIRNAME="${DIRNAME#./}"
        if [ ! -d "$TARGET/$DIRNAME" ]; then
            mkdir --verbose --parents "$TARGET/$DIRNAME"
            err=$?
            if [ $err != 0 ]; then
                exit $err
            fi
        fi

        BASENAME=`basename "$FILE"`
        EXT="${BASENAME##*.}"
        if [ "$EXT" = "$BASENAME" ]; then
            EXT=""
        else
            EXT=".$EXT"
        fi
        NAME="${BASENAME%.*}"
        if echo "$NAME" | grep -q ' '; then
            NAME=`echo "$NAME" | sed 's/\s/_/g'`
        fi
        LEN_NAME=${#NAME}
        if (( $LEN_NAME > 8 )); then
            NAME1="${NAME::7}~"
            N=0
            while [ -f "$TARGET/$DIRNAME/$NAME1$EXT" ]; do
                (( N = N + 1 ))
                if [ $N = 10 ]; then
                    echo "невозможно создать ещё один файл"
                    exit 71
                fi
                NAME1="${NAME::6}~$N"
            done
            NAME="$NAME1"
        fi
        ln --verbose "$FILE" "$TARGET/$DIRNAME/$NAME$EXT"
        err=$?
        if [ $err != 0 ]; then
            exit $err
        fi
    done
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

2

правила резки:

1) полное имя состоит из имени и расширения.
2) если имя не больше 8и символов оно оставляется как есть.
3) если имя больше, то обрезаются все символы кроме первых 7и, и восьмым вставляется '~'
4) если такой файл уже есть, то берётся 6 символов, а 7ым и восьмым ставится ~1
5) если такой файл есть, то вставляется ~2
6) пункты (4) и (5) повторяются, до ~9, если и такой есть, то программа завершается с ошибкой.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

3

зависимости:

bash.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

4 (28.07.2011 21:49:01 отредактировано Минздрав)

А как этот скрипт запускать?
Где директорию указывать в которой обрезаемые файлы лежат?
Есть FAQ по запуску скриптов?

drBatty пишет:

правила резки:
пункты (4) и (5) повторяются, до ~9, если и такой есть, то программа завершается с ошибкой.

Блин облом. А что нельзя оставлять первые 13 символов и последние заменять, с разрядом до третьего знака?

5

Минздрав пишет:

Есть FAQ по запуску скриптов?

1) создаём скрипт с любым именем. Хотя я обычно создаю скрипты с именем *.sh, что-бы самому не путаться.
2) в первой (это важно) строке пишем

#!/bin/bash

Я обычно пишу скрипты именно для bash'а. Хотя многие скрипты работают и с более простой оболочкой /bin/sh.
3) устанавливаем права доступа. Либо через гуй (скрины делать лень), либо

 Консоль:
$ chmod +x script.sh

4) запускаем
 Консоль:
$ ./script.sh

Минздрав пишет:

Блин облом. А что нельзя оставлять первые 13 символов и последние заменять, с разрядом до третьего знака?

откуда вы взяли такие правила?
В MS-DOS файлы именовались по правилу 8.3
12345678.123 например.
8 символов в имени + 3 символа в расширении, и точка между ними, итого 12 символов. 13 откуда?

Можно. Если вы мне объясните, на что заменять, и зачем это надо.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)