тут попросили.
этот скрипт делает хардлинки (вторые имена) на файлы, и если они слишком длинные их обрезает, например
$ ~/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Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)
