The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Как заменить регистр первой буквы названия файла?"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 30-Июн-08, 18:10 
Добрый день!
Нужен скрипт на bash, который нашел бы все имена файлов(и только файлов, имена директорий должны остаться неизменными)в текущей директории и всех его поддиректориях, начинающиеся с верхнего регистра и заменил бы на нижний регистр.
Пробовал по-разному, никак не удается((
find . -type f | grep ^[[:upper:]] - вывод find в формате ./test.sh, соответственно для grep-а первый знак-точка, вот он и не выводит ничего
ls -RF | grep -v "\/" | grep ^[[:upper:]] - выводит как нужно, но tr ^[[:upper:]] ^[[:lower:]] переводит все имя файла в нижний регистр. Да и потом скрипт не сможет добраться до файла, если он будет в поддиректории.
Помогите, пожалуйста.
Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как заменить регистр первой буквы названия файла?"  
Сообщение от Андрей (??) on 30-Июн-08, 22:39 
>Помогите, пожалуйста.

пожалуста помогаем :-)

find . -type f | while read fpath; do dirnam=`dirname $fpath`; fnam=`basename $fpath|sed "s/^\(.\)/\u\1/"`; echo mv $fpath $dirnam/$fnam; done

пример не учитывает имена файлов с пробелами (будут сообщения о не найденых файлах)
согласно условию будут найдены только файлы.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 30-Июн-08, 23:08 
>find . -type f | while read fpath; do dirnam=`dirname $fpath`; fnam=`basename
>$fpath|sed "s/^\(.\)/\u\1/"`; echo mv $fpath $dirnam/$fnam; done

Спасибо!
не работает(( Вывод:
mv ./test.sh ./Test.sh
mv ./Asd/DSa/As ./Asd/DSa/As
mv ./Sadf ./Sadf
Оставил имена с верхним регистром, зато переименовал в верхний, тот, что был с нижним. Сейчас ток заметил, поэтому правлю. Система-altlinux. С правами все в порядке(это тестовый каталог в домашней папке)буду вникать))


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Как заменить регистр первой буквы названия файла?"  
Сообщение от Андрей (??) on 30-Июн-08, 23:19 
>[оверквотинг удален]
>>$fpath|sed "s/^\(.\)/\u\1/"`; echo mv $fpath $dirnam/$fnam; done
>
>Спасибо!
>не работает(( Вывод:
>mv ./test.sh ./Test.sh
>mv ./Asd/DSa/As ./Asd/DSa/As
>mv ./Sadf ./Sadf
>Оставил имена с верхним регистром, зато переименовал в верхний, тот, что был
>с нижним. Сейчас ток заметил, поэтому правлю. Система-altlinux. С правами все
>в порядке(это тестовый каталог в домашней папке)буду вникать))

это я не внимательно прочитал исходное сообщение.
там надо в sed поменять \u на \l
и ещё надо убрать echo перед mv

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 30-Июн-08, 23:26 
хотел отредактировать, получилось наплодил. Извините)) А удалить свое сообщение нельзя?
так?
find . -type f | while read fpath; do dirnam=`dirname $fpath`; fnam=`basename $fpath|sed "s/^\(.\)/\1\1/"`; mv $fpath $dirnam/$fnam; done
Он просто удвоил мне буквы))Истина где-то рядом))
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Как заменить регистр первой буквы названия файла?"  
Сообщение от Андрей (??) on 30-Июн-08, 23:52 
>хотел отредактировать, получилось наплодил. Извините)) А удалить свое сообщение нельзя?
>так?
>find . -type f | while read fpath; do dirnam=`dirname $fpath`; fnam=`basename
>$fpath|sed "s/^\(.\)/\1\1/"`; mv $fpath $dirnam/$fnam; done
>Он просто удвоил мне буквы))Истина где-то рядом))

упс не доглядел что \l (слэш эль) похожа на \1 (слэщ один)
в sed надо прописать слэш эль вместо первой слэш один

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 01-Июл-08, 00:05 
Спасибо огромное! работает)) теперь постараюсь вникнуть как)) и заодно найти решение с пробелами
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Как заменить регистр первой буквы названия файла?"  
Сообщение от madskull (??) on 01-Июл-08, 10:27 
>Спасибо огромное! работает)) теперь постараюсь вникнуть как)) и заодно найти решение с
>пробелами

С пробелами просто - забрать в кавычки. Ну и уменьшить код за счет "жадности" регекспа sed'a

find . -type f | while read fpath; do mv "$fpath" "$(echo "$fpath"| sed 's,^\(.*/\)\(.\),\1\l\2,')" ; done

А еще есть утилитка rename.
Правда их в разных дистрах как минимум две разновидности - перловая и не перловая.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 01-Июл-08, 13:35 
Спасибо огромное! работает. красиво))

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 15-Июл-08, 02:50 
Задача еще более усложнилась))
Нужно переименовать все файлы, начинающиеся с верхнего регистра на нижний, и, если, идет несколько букв в верхнем регистре с самого начала названия файла, то понизить все, кроме последней, начинающейся с верхнего регистра(ее не трогать) Искать в текущей директории и во всех ее поддиректориях.
Нащупал алгоритм решения, но только начинаю изучать баш, поэтому сам не справлюсь.
1 -  понизить регистр 1-й буквы всех назв. файлов
2 - искать во всех именах, где встречаются 2 или более буквы в верхнем регистре рядом
3 - запустить цикл
а) если 3 буква в верхнем регистре
то понизить регистр 2-й буквы и продолжать обрабатывать
если нет, то не обрабатывать
б) если 4-я буква в верхнем регистре
то понизить регистр 3-ей буквы ... и т.д.  до n
примерно, как представляю(хотя еще не проверял синтаксис)
#!/bin bash
find . -type f | grep [^*A-ZA-Z*$] #найти все файлы, в которых соседние буквы в верхнем регистре
while read fpath
if
grep [^..A-Z*] #если 3-я буква в верхнем регистре
do mv "$fpath" "$(echo "$fpath"| sed "2 символ в нижний регистр"#перевести 2 в нижний
else exit 0 #если нет, то пропустить файл
fi
if
grep [^...A-Z*]#если 3-я буква в верхнем регистре
do mv "$fpath" "$(echo "$fpath"| sed "3 символ в нижний регистр"перевести 3 в нижний
else exit 0 #если нет, то пропустить файл
fi
if
... и так до 9#думаю хватит))
done

Помогите, плиз


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Как заменить регистр первой буквы названия файла?"  
Сообщение от phpcoder email(??) on 15-Июл-08, 08:59 
>Помогите, плиз

#!/bin/sh

find . -type f |
    while read FILE; do
        F=$(basename "$FILE")
        if echo "$F" | grep -q '^[[:upper:]]'; then
            if echo "$F" | grep -q '^[[:upper:]][[:lower:]]'; then
                mv -vf "$FILE" "$(dirname "$FILE")/$(echo "$F" | perl -pwne 's/^(.)/\l$1\L/')"
            else
                UPPER_PART=$(echo $F | sed 's|^\([[:upper:]]\+\)[[:upper:]].*|\1|')
                LOWER_PART=$(echo $F | sed 's|^[[:upper:]]\+\([[:upper:]].\+\)|\1|')
                mv -vf "$FILE" "$(dirname "$FILE")/$(echo "$UPPER_PART" | tr '[:upper:]' '[:lower:]')$LOWER_PART"
            fi
        fi
    done

У меня вывела примерное следующее:

[c0der@xxx ~/TEST]$ ./find.sh
`./Test' -> `./test'
`./TEst' -> `./tEst'
`./FOOTest' -> `./fooTest'

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 15-Июл-08, 11:55 
>#!/bin/sh

Спасибо огромное, работает. Но пара вопросов в процессе тестирования.
а #!/bin/bash также можно? Ту нет специфических sh-конструкций, по-моему?
и по тестированию:
- sDASDAsda - не переименовывает, а у нас уже есть пониженный регистр 1-й буквы
- `./SDA' -> `./sdDA' - добавляет букву((

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "Как заменить регистр первой буквы названия файла?"  
Сообщение от phpcoder email(??) on 15-Июл-08, 13:48 
>а #!/bin/bash также можно? Ту нет специфических sh-конструкций, по-моему?

/bin/bash можно (хоть /usr/local/bin/zsh) только зачем? Тут нет bash-специфичных инструкций (надеюсь).

>и по тестированию:
>- sDASDAsda - не переименовывает, а у нас уже есть пониженный регистр
>1-й буквы

Не переименовывает, потому что первая буква не заглавная. Согласно заданию, это правильное поведение:

>Нужно переименовать все файлы, начинающиеся с верхнего регистра на нижний, и, если, идет несколько букв в верхнем регистре с самого начала названия файла, то понизить все, кроме последней, начинающейся с верхнего регистра(ее не трогать)

Тут четко написано, что "начинающиеся с верхнего регистра" и "несколько букв в верхнем регистре с самого начала названия файла".

>- `./SDA' -> `./sdDA' - добавляет букву((

А это баг. Правится, так:

-LOWER_PART=$(echo $F | sed 's|^[[:upper:]]\+\([[:upper:]].\+\)|\1|')
+LOWER_PART=$(echo $F | sed 's|^[[:upper:]]\+\([[:upper:]].*\)|\1|')

Т.е. в одном месте нужно заменить \+ на *

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

13. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 15-Июл-08, 14:15 
>Т.е. в одном месте нужно заменить \+ на *

Спасибище)) работает

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

14. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 18-Июл-08, 23:17 
Еще одно усложнение задачи)), или вернее ((
1) Если название файла начинается с буквы в верхнем регистре, то понизить регистр(OmgFile -> omgFile)
2) Если после этого, следующие буквы или буква тоже в верхнем регистре, то при условии, что следующим символом после группы букв в верхнем регистре является:
а) буква[a-z] в нижнем регистре, то понизить в регистре все буквы, кроме последней(ее оставить в верхнем регистре)
(OMGFile -> omgFile)
б) любой другой символ(включая и цифры), то понизить в регистре все буквы, включая последнюю (до символа)(OMG-File -> omg-File,OMG1file -> omg1file)
3) Если имя файла состоит полностью из букв в верхнем регистре, то понизить в регистре все буквы(OMG -> omg)
Чувствую, что надо вставить два if после else, но что именно не могу, так как код слишком сложен для меня)) Помогите еще разок, пожалуйста.
Для удобства привожу внизу код.
find . -type f |
    while read FILE; do
        F=$(basename "$FILE")
        if echo "$F" | grep -q '^[[:upper:]]'; then
            if echo "$F" | grep -q '^[[:upper:]][[:lower:]]'; then
                mv -vf "$FILE" "$(dirname "$FILE")/$(echo "$F" | perl -pwne 's/^(.)/\l$1\L/')"
            else
                UPPER_PART=$(echo $F | sed 's|^\([[:upper:]]\+\)[[:upper:]].*|\1|')
                LOWER_PART=$(echo $F | sed 's|^[[:upper:]]\+\([[:upper:]].*\)|\1|')
                mv -vf "$FILE" "$(dirname "$FILE")/$(echo "$UPPER_PART" | tr '[:upper:]' '[:lower:]')$LOWER_PART"
            fi
        fi
    done
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

15. "Как заменить регистр первой буквы названия файла?"  
Сообщение от phpcoder email(??) on 19-Июл-08, 21:02 
>Чувствую, что надо вставить два if после else, но что именно не
>могу, так как код слишком сложен для меня)) Помогите еще разок,
>пожалуйста.

Э. Сейчас помочь не смогу -- лень проверять и вдумываться -- у меня сегодня и завтра выходные %)) Могу подсказать и ответить на конкретно поствленные вопросы.

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

16. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 20-Июл-08, 03:13 
>...проверять и вдумываться ... Могу подсказать и ответить на
>конкретно поставленные вопросы.
>Короче, вам нужно сделать так:
>- составить алгоритм на русском, разбив условия и действия на задачи
>- попытаться все это по порядку записать на шелле...

я, наверное, перестарался, пробуя четко составить задачу))
ИМХО, все должно остаться таким же, только чуть добавить условий.
по-моему, надо добавить после 1 части (if)
# если имя файла состоит только из букв в верхнем регистре, понизить регистр всех букв
if echo "$F" | grep -q 'содержит только буквы в верхнем регистре'; then      # выражение все в верхнем регистре-как?
mv -vf "$FILE" "$(dirname "$FILE")/$(echo "$F" | tr '[[:upper:]]' '[[:lower:]]'"      # понизить регистр всех букв
и изменить вторую часть(после else) Вот здесь sed, поэтому могу ошибаться
если "LOWER_PART" начинается с буквы в нижнем регистре
то понизить в регистре "UPPER_PART" все буквы, кроме последней(ее оставить в верхнем регистре)
если "LOWER_PART" начинается с любого другого символа(кроме буквы),
то понизить в регистре все буквы, включая последнюю


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

17. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 20-Июл-08, 05:05 
не-а, ошибаюсь. Если:
>по-моему, надо добавить после 1 части (if)
># если имя файла состоит только из букв в верхнем регистре, понизить регистр всех букв
>if echo "$F" | grep -q 'содержит только буквы в верхнем регистре'; then      # выражение все в верхнем регистре-как?
>mv -vf "$FILE" "$(dirname "$FILE")/$(echo "$F" | tr '[[:upper:]]' '[[:lower:]]'"      # понизить регистр всех букв

то, придется поставить else перед ним, и возникнет проблема, как связать со вторым else
Скорее:
если "LOWER_PART" начинается с любого другого символа(кроме буквы, включая и "конец строки($-так?)" или, по умолчанию, в "любой символ, кроме букв" попадет и "конец строки"?
Тогда правильно обработается и условие "если имя файла состоит только из букв в верхнем регистре, понизить регистр всех букв "
т.е.
если "LOWER_PART" начинается с буквы в нижнем регистре,
то понизить в регистре "UPPER_PART" все буквы, кроме последней(ее оставить в верхнем регистре)
если "LOWER_PART" начинается с любого другого символа(кроме буквы, но включая и "конец строки"),

то понизить в регистре все буквы, включая последнюю

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

18. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 20-Июл-08, 06:32 
Еще одна попытка формализовать))
# начало части кода без изменений############################################################################
find . -type f |
    while read FILE; do
        F=$(basename "$FILE")
        if echo "$F" | grep -q '^[[:upper:]]'; then
            if echo "$F" | grep -q '^[[:upper:]][[:lower:]]'; then
                mv -vf "$FILE" "$(dirname "$FILE")/$(echo "$F" | perl -pwne 's/^(.)/\l$1\L/')"
# конец части кода без изменений############################################################################
            else
                UPPER_PART="группа, идущих подряд, букв верхнего регистра с начала названия файла"
                LOWER_PART="все, что идет после группы, идущих подряд, букв верхнего регистра с начала названия файла"
            if $LOWER_PART начинается с буквы[[:a-z:]];then
                понизить в регистре весь "UPPER_PART", кроме последней буквы
            if $LOWER_PART начинается с любого символа, кроме буквы(включая и "перевод строки" или в "$LOWER_PART ничего нет"(смотря какая конструкция реализуема));then
                mv -vf "$FILE" "$(dirname "$FILE")/$(echo "$UPPER_PART" | tr '[:upper:]'  '[:lower:]')$LOWER_PART"    # понизить в регистре весь "UPPER_PART"
            fi
        fi
            fi
        fi
    done
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

19. "Как заменить регистр первой буквы названия файла?"  
Сообщение от angra (ok) on 20-Июл-08, 07:32 
Может уже пора переходить к тяжелой артиллерии - perl? ИМХО писать логику на шелле это для мазохистов и пуристов.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

20. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 20-Июл-08, 09:29 
>Может уже пора переходить к тяжелой артиллерии - perl? ИМХО писать логику
>на шелле это для мазохистов и пуристов.

еще в шелле даже не разобрался(( куда там perl))
там все-таки else между двумя if вставить придется.
* плохо, что нельзя удалять и редактировать после получаса свои сообщения. Расплодил((

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

21. "Как заменить регистр первой буквы названия файла?"  
Сообщение от phpcoder email(??) on 20-Июл-08, 14:55 

#!/bin/sh

find . -type f |
    while read FILE; do
        # получаем из пути к файлу только его имя
        F=$(basename "$FILE")
        
        # если слово начинается с заглавной буквы
        if echo "$F" | grep -q '^[[:upper:]]'; then
            
            # если в слове только перва буква заглавная
            # (требование #1)
            if echo "$F" | grep -q '^[[:upper:]][[:lower:]]'; then
                NEW_NAME="$(dirname "$FILE")/$(echo "$F" | perl -pwne 's/^(.)/\l$1\L/')"
            
            # если после первой заглавной буквы есть ещё буквы в верхнем регистре
            else
                # если всё слово состоит из букв в верхнем регистре
                # (требование #3)
                if echo "$F" | grep -qx '[[:upper:]]\+'; then
                    NEW_NAME="$(echo "$F" | tr '[:upper:]' '[:lower:]')"

                # если после заглавных -- не буква
                # (требование #3б)
                elif echo "$F" | grep -q '^[[:upper:]]\+[^[:alpha:]]'; then
                    UPPER_PART="$(echo "$F" | sed 's|^\([[:upper:]]\+\)[^[:alpha:]].*|\1|')"
                    LOWER_PART="$(echo "$F" | sed 's|^[[:upper:]]\+\([^[:alpha:]].*\)|\1|')"
                    NEW_NAME="$(dirname "$FILE")/$(echo "$UPPER_PART" | tr '[:upper:]' '[:lower:]')$LOWER_PART"                  
                # если после заглавных -- незаглавные
                # (требование #3a)
                else
                    UPPER_PART="$(echo "$F" | sed 's|^\([[:upper:]]\+\)[[:upper:]].*|\1|')"
                    LOWER_PART="$(echo "$F" | sed 's|^[[:upper:]]\+\([[:upper:]].*\)|\1|')"
                    NEW_NAME="$(dirname "$FILE")/$(echo "$UPPER_PART" | tr '[:upper:]' '[:lower:]')$LOWER_PART"
                fi
            fi
            
            # производим переименовывание
            mv -vf "$FILE" "$NEW_NAME"
        fi
    done

Вот, что выводит:

[c0der@rock ~/TEST]$ ./find.sh
`./OmgFile' -> `./omgFile'
`./OMGFile' -> `./omgFile'
`./OMG-File' -> `./omg-File'
`./OMG1file' -> `./omg1file'
`./OMG' -> `omg'

Обратите внимание, что файлы OmgFile и OMGFile были переименованы в omgFile, т.е. по сути содержимое файла OmgFile было позже перезатёрто файлом OMGFile. Что делать в этом случае?

Ну и с постановкой задачи вы не перестарались, а всё сделали очень хорошо -- написали требования, привели test case'ы, так что закодировать это всё было делом недолгим (минут 20 максимум).

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

22. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 21-Июл-08, 17:07 
спасибо огромное, работает.
>Обратите внимание, что файлы OmgFile и OMGFile были переименованы в omgFile, т.е.
>по сути содержимое файла OmgFile было позже перезатёрто файлом OMGFile.

Это происходит только когда они находятся в 1 директории, правильно?
>Что делать в этом случае?

Час от часу не легче))
Если "Это происходит только когда они находятся в 1 директории"=верно,
такие файлы можно только вручную переименовывать. То есть, сначала найти их, вручную переименовать и только потом запускать скрипт переименования.
еще 1 скрипт((
поиск файлов, отличающихся в названии только регистром в одной и той же директории и имена таких файлов(с полным путем к ним) |  tr '[:upper:]' '[:lower:]' | uniq -D > duplicates.txt
Так?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

23. "Как заменить регистр первой буквы названия файла?"  
Сообщение от phpcoder email(??) on 21-Июл-08, 17:26 
>еще 1 скрипт((
>поиск файлов, отличающихся в названии только регистром в одной и той же директории и имена таких файлов(с полным путем к ним) |  tr '[:upper:]' '[:lower:]' | uniq -D > duplicates.txt
>Так?

Например, так:

[c0der@xxx ~]$ find TEST -type f | tr '[:upper:]' '[:lower:]' | sort | uniq -d | while read F; do find TEST -type f -iname "$(basename $F)"; done
TEST/test
TEST/TEST
TEST/TeST

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

24. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 21-Июл-08, 18:15 
спасибо, практически готовый код)) Я добавил, чтобы в выводе остались только дубли имен файлов в одной директории.

#!/bin/sh

find test -type f | tr '[:upper:]' '[:lower:]' | sort | uniq -d |
    while read F
        do find test -type f -iname "$(basename $F)" | uniq -iD > duplicates.txt
        done


Вывод получается:

/home/test/OmgFile
/home/test/OMGFile
/home/test/second/OMGFile
/home/test/second/omgFile

То что надо.
Правильно? Никакие грабли меня не подстерегают?))
отворматировало странно)) Тоже надо почитать))
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

25. "Как заменить регистр первой буквы названия файла?"  
Сообщение от phpcoder email(??) on 21-Июл-08, 19:06 
>Правильно? Никакие грабли меня не подстерегают?))

Не знаю -- вам должно быть видней. Я только не пойму зачем вы uniq -iD впихнули сюда и зачем перенаправление в файл сделали? Первое по идее не нужно, файлы итак уже будут уникальными, второе я бы лучше сделал запуская скрипт и перенаправляя его вывод в файл.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

26. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 21-Июл-08, 20:17 
>Не знаю -- вам должно быть видней.

я имел в виду, правильный ли синтаксис, не споткнется на пробелах и т.п.,

>Я только не пойму зачем вы uniq -iD впихнули сюда и зачем перенаправление в файл сделали?
>Первое по идее не нужно, файлы итак уже будут уникальными, второе
>я бы лучше сделал запуская скрипт и перенаправляя его вывод в
>файл.

по второму, вы правы, если не вписывать вывод в файл и вместо имени папки ставить . скрипт будет универсальным, вы это имели в виду?
а вот по первому, скрипт дает и уникальные файлы тоже, а нужно то только те, которые существуют в нескотьких вариантах написания. Вот пример:
./DIR/OmgFile
./DIR2/OmgFile
./DIR2/OMGFILE
./DIR2/Omgfile
./OmgFile
./OMGFile
./DIR/OmgFile
./DIR2/OmgFile
./DIR2/OMGFILE
./DIR2/Omgfile
./OmgFile
./OMGFile
То есть, ./DIR/OmgFile один в директории, поэтому не нужен в выводе. Я решил это с помощью uniq -iD
Кстати, когда добавил папку, пошли дубли(видно по выводу), а если в теле скрипта перенаправление в файл дублей нет. Вот это не пойму.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

27. "Как заменить регистр первой буквы названия файла?"  
Сообщение от phpcoder email(??) on 21-Июл-08, 20:39 
Попробуйте вот этим однострочником:

find . -type f | awk '{printf("%s\t%s\n", $0, tolower($0))}' | sort -k2 | uniq -d -f1 | awk '{print $1}'


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

28. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 21-Июл-08, 21:04 
Работает правильно, но в выводе:
find . -type f | awk '{printf("%s\t%s\n", $0, tolower($0))}' | sort -k2 | uniq -d -f1 | awk '{print $1}' > dups2.txt
./DIR2/Omgfile
./DIR3/omgfile
./OmgFile
только пути, где имена файлов отличаются регистром
а
find . -type f | tr '[:upper:]' '[:lower:]' | sort | uniq -d | while read F; do find . -type f -iname "$(basename $F)" | uniq -iD > dups.txt; done
./DIR3/omgfile
./DIR3/Omgfile
./DIR2/OmgFile
./DIR2/OMGFILE
./DIR2/Omgfile
./OmgFile
./OMGFile
пути и сами имена, отличающиеся регистром, более информативно.
Боюсь надоесть, работает и ладно)) Попробую потом сам разобраться. Или что-то там неправильно?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

29. "Как заменить регистр первой буквы названия файла?"  
Сообщение от phpcoder email(??) on 21-Июл-08, 21:16 
>Работает правильно, но в выводе:
>find . -type f | awk '{printf("%s\t%s\n", $0, tolower($0))}' | sort -k2 | uniq -d -f1 | awk '{print $1}' > dups2.txt

[...]
>Или что-то там  неправильно?

Похоже на то. Замените uniq -d -f1 на uniq -D -f1


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

30. "Как заменить регистр первой буквы названия файла?"  
Сообщение от dilidi email(ok) on 21-Июл-08, 21:27 
>Замените uniq -d -f1 на uniq -D -f1

Работает))замечательно)) Теперь целых 2 скрипта))
Спасибо огромное!!!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

31. "Как заменить регистр первой буквы названия файла?"  
Сообщение от phpcoder email(??) on 21-Июл-08, 21:32 
>Работает))замечательно)) Теперь целых 2 скрипта))

Первые два бесплатно, ага :)))

P.S. Новые вопросы задавайте уже в новых топиках.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру