Итого:
#!/bin/bash
# max file length
len=12
# add number if file already exists
add=0
# flag of check if same dir
olddir=''
# find all files
while read file ; do
# get file name without path
fname=`basename $file`
# check length
[ ${#fname} -gt "$len" ] && {
# check if hidden; sets tmp name and extension
hidden=`echo $fname | grep '^\.'`
if [ $? -eq 0 ]; then
tmp=`echo $fname | cut -c 2-`
tmp=".${tmp%.*}"
else
tmp=${fname%.*}
fi
ext=${fname#$tmp}
let maxlen=$len-${#ext}
if [ ${#tmp} -gt "$maxlen" ]; then
ext=${ext::((4))}
else
ext=${ext::(($len-${#tmp}))}
fi
# set result name
dest="${file%$fname}${tmp::$(($len-${#ext}))}$ext"
# check for existing
if [ -f $dest ]; then
if [ "$olddir" = `dirname $file` ]; then
let add+=1
else
olddir=`dirname $file`
add=1
fi
while [ -f "${file%$fname}${tmp::$(($len-${#ext}-${#add}))}$add$ext" ]; do let add+=1; done
# rename
mv "$file" "${file%$fname}${tmp::$(($len-${#ext}-${#add}))}$add$ext"
echo "File moved from $file to ${file%$fname}${tmp::$(($len-${#ext}-${#add}))}$add$ext"
else
# rename
mv "$file" "${file%$fname}${tmp::$(($len-${#ext}))}$ext"
echo "File moved from $file to ${file%$fname}${tmp::$(($len-${#ext}))}$ext"
fi
}
done < <(find $1 -type f | sort)
Принимаются замечания))))
P.S. Было желание поставить continue при нахождении скрытого файла. мало чего он скрытый и трогать его думаю явно не надо
Cxms, Azure дал идею) Просили подсказок, а не всю реализацию. И напомню Вам, Ваш скрипт не решает поставленную задачу. Мало того, что файл может со скрытого стать обычным, так еще и зачастую в конец имени файла пишут доп инфо (битрейт, размер, кодек и т.д.), и вы именно оставляете эту часть, что в будущем очень затруднит поиск и навигацию.