Как перевести имя файла в нижний или верхний регистр
Используя этот скрипт взятый из 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
- 2134 просмотра
Страница для печати


По-моему, славная программа 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/shcase "$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% #.........
анонимусами полнится мир. а ЛОР у нас, как известно, кузница профессионалов ;)
Отправить комментарий