Как перевести имя файла в нижний или верхний регистр


ramok аватар

ramok - Posted on 13 Январь 2006

Используя этот скрипт взятый из info sed
все что ниже можно просто выделить и скопировать в шел

cat << END_SCRIPT > move-to-lower
#! /bin/sh
# rename files to lower/upper case...
#
# usage:
#    move-to-lower *
#    move-to-upper *
# or
#    move-to-lower -R .
#    move-to-upper -R .
#
 
help()
{
   cat << eof
Usage: $0 [-n] [-r] [-h] files...
 
-n      do nothing, only see what would be done
-R      recursive (use find)
-h      this message
files   files to remap to lower case
 
Examples:
       $0 -n *        (see if everything is ok, then...)
       $0 *
 
       $0 -R .
 
eof
}
 
apply_cmd='sh'
finder='echo "$@" | tr " " "\n"'
files_only=
 
while :
do
    case "$1" in
        -n) apply_cmd='cat' ;;
        -R) finder='find "$@" -type f';;
        -h) help ; exit 1 ;;
        *) break ;;
    esac
    shift
done
 
if [ -z "$1" ]; then
    echo Usage: $0 [-h] [-n] [-r] files...
    exit 1
fi
 
LOWER='abcdefghijklmnopqrstuvwxyz'
UPPER='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
 
case `basename $0` in
    *upper*) TO=$UPPER; FROM=$LOWER ;;
    *)       FROM=$UPPER; TO=$LOWER ;;
esac
 
eval $finder | sed -n '
 
# remove all trailing slashes
s/\/*$//
 
# add ./ if there is no path, only a filename
/\//! s/^/.\//
 
# save path+filename
h
 
# remove path
s/.*\///
 
# do conversion only on filename
y/'$FROM'/'$TO'/
 
# now line contains original path+file, while
# hold space contains the new filename
x
 
# add converted file name to line, which now contains
# path/file-name\nconverted-file-name
G
 
# check if converted file name is equal to original file name,
# if it is, do not print nothing
/^.*\/\(.*\)\n\1/b
 
# now, transform path/fromfile\n, into
 
# now, transform path/fromfile\n, into
# mv path/fromfile path/tofile and print it
s/^\(.*\/\)\(.*\)\n\(.*\)$/mv \1\2 \1\3/p
 
' | $apply_cmd
END_SCRIPT
$ ln -s move-to-lower move-to-upper
$ chmod +x move-to-lower move-to-upper
0
Ваша оценка: Ничего

По-моему, славная программа convmv делает то же самое..

app-text/convmv (1.09): convert filenames to utf8 or any other charset

USAGE: convmv [options] FILE(S)
-f enc encoding *from* which should be converted
-t enc encoding *to* which should be converted
-r recursively go through directories
-i interactive mode (ask for each action)
--exec c execute command instead of rename (use #1 and #2 and see man page)
--nosmart ignore if files already seem to be UTF-8 and convert if posible
--notest actually do rename the files
--replace will replace files if they are equal
--unescape convert%20ugly%20escape%20sequences
--upper turn to upper case
--lower turn to lower case

кроме того, она работает бвстрее, т.к. написана на c..

то что доктор прописал Ж:-)
snx
--
Signature invent in progress 19% #.........

мне кажется, что использовать в данном случае sed - это как чесать за ухом ногой...
я очень давно пользуюсь вот таким скриптом. он не обеспечивает всей функциональности сабжа, но, по крайней мере, нормально переводит файлы с русскими именами.
#!/bin/sh
case "$0" in
*upper*)f=lower t=upper;;
*)f=upper t=lower;;
esac
for x in $@
do
lc=`echo $x | tr "[[:$f:]]" "[[:$t:]]"`
[geshifilter- "$x" != "$lc" ] && mv -i "$x" "$lc" done</code> при этом, сам процесс изменения имени с помошью tr несравнимо проще и понятнее. а рекурсивный обход не так уж часто и требуется.[/geshifilter-]

а ты сделай с такой же функциональностью что в скрипте выше и не думаю что выйдет интуитивнее и понятнее Ж:-) по крайней мере для тех кто знает sed

а sed - потому что почитай в превоначальном посту откуда взят этот скрипт Ж:-)

--
Signature invent in progress 19% #.........

А проще можно - с перлом идет скрипт rename.
rename '$_=lc' * - вниз
rename '$_=uc' * - вверх

echo UPPER2lower | tr A-Z a-z

не будет отлавливать русских букв
в отличии от [:upper:] и [:lower:] предложеных выше
--
Signature invent in progress 19% #.........

По-моему, оба скрипта не смогут справиться с именами файлов, содержащими пробелы.

Что скажут авторы?

Да и потом, неплохо бы вспомнить все-таки про xargs, а то ведь при большом количестве файлов будет нехорошо-с.
Идет речь о рекурсивной обработке дерева каталогов - загнется ведь.

unix way :-)

вон сколько анонимусов развелось... почти что ЛОР....
файлы с пробелами лечаться легко. надо просто $@ заменить на "$@"
это я по пару лет назад как-то пропустил, да с тех пор ни разу не было повода переделать - оказывается нету у меня файлов с пробелами (:

а вот про xargs - не понял. что и где загнется?

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

Скрипт elide с этой точки зрения хитрее - переименовывает только свои аргументы. Т.е. find -exec upper2lower спасает ситуацию.

Но остается чувство незавершенности - сначала вспомогательный скрипт, затем команда. Возможно, существует более красивое решение. Но это из области эстетики. Хотя говорят, правильные сделанные вещи не могут вызывать чувства незавершенности :-) ...

> При достаточно большом дереве файлов быстро достигент предела выделения памяти
выше уже просили объяснить в каком именно месте ставить xargs?
где оно тут может помочь? Ж:-) уже вот 2 человека как минимум не видят этого

--
Signature invent in progress 19% #.........

анонимусами полнится мир. а ЛОР у нас, как известно, кузница профессионалов ;)

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.