LinuxForum.Fans
Тема

Скрипт для обрезания длинных имён файлов

Автор: drBatty 5 сообщений 2972 просмотров
#180052

тут попросили.
этот скрипт делает хардлинки (вторые имена) на файлы, и если они слишком длинные их обрезает, например
[console]
$ ~/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»
[/console]

text
#!/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

#180057

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

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

#180058

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

bash.

#180205

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

drBatty написал:
правила резки:
пункты (4) и (5) повторяются, до ~9, если и такой есть, то программа завершается с ошибкой.
Блин облом. А что нельзя оставлять первые 13 символов и последние заменять, с разрядом до третьего знака?
#180305
Минздрав написал:
Есть FAQ по запуску скриптов?

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

text
#!/bin/bash

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

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

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

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

Войдите или зарегистрируйтесь, чтобы ответить.