LINUX.ORG.RU

Массовый перевод файлов в директории с поддиректориями в нижний регистр.

 ,


1

1

Приветствую!
Есть более 3000 файлов в директории с поддиректориями, мне нужно перевести всё в нижний регистр. У некоторых файлов в названии файла есть пробел, например Test file_dir.log. Как это сделать?

Ну я из скриптовых языков более-менее нормально Python знаю, поэтому я бы на нём скрипт писал. Для перевода в нижний регистр — метод lower() строки. Для обхода дерева и переименования нужные функции есть в модуле os.

Ttt ☆☆☆☆☆ ()
find -type f -exec rename 'y/A-Z/a-z/' {} \;
anonymous ()
Ответ на: комментарий от anonymous

чудесно. А я вот целый велосипед :-(

#!/usr/bin/env bash

if [ $# -lt 1 ]
then
        echo "USAGE find_and_rename.sh <root-directory>"
        exit
fi

file_list=`find $1 -type f`

for f in $file_list
do
        tmp=`echo $f | tr '[A-Z]' '[a-z]'`
        tmp2=`dirname $f`/`basename $tmp`

        mv $f $tmp2
done


rikardoac ()

Что-то ничего не работает.
Вот эта команда работает, нашел в инете: for i in $( ls | grep [A-Z] ); do mv -i $i `echo $i | tr ‘A-Z’ ‘a-z’`; done, но она по директории переименовывает. Как бы сделать так, чтобы она и по поддиректориям переименовывала?

anonimous ()
#!/bin/bash
# recursively rename all files and directories in a given folder to lowercase

if [[ $# == 0 ]]; then
    echo "usage: lower PATH"
    exit 2
elif [[ ! -d "$1" ]]; then
    echo "lower: $1 not a directory"
    exit 1
fi

find "$1" -nowarn -depth | head -n-1 | while read -r path; do
    newpath="$(dirname "$path")/$(basename "$path" | tr 'A-Z' 'a-z')"
    if [[ ! -e "$newpath" ]]; then
        mv "$path" "$newpath"
    fi
done
Deleted ()
Ответ на: комментарий от rikardoac
1a2,3
> SAVEIFS=$IFS
> IFS=$(echo -en "\n\b")
5,6c7,8
<         echo "USAGE find_and_rename.sh <root-directory>"
<         exit
---
> 	echo "USAGE find_and_rename.sh <root-directory>"
> 	exit
13,14c15,16
<         tmp=`echo $f | tr '[A-Z]' '[a-z]'`
<         tmp2=`dirname $f`/`basename $tmp`
---
> 	tmp=`echo $f | tr '[a-z]' '[A-Z]'`
> 	tmp2=`dirname $f`/`basename $tmp`
16c18
<         mv $f $tmp2
---
> 	mv $f $tmp2
17a20
> IFS=$SAVEIFS

rikardoac ()
Ответ на: комментарий от anonimous

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

#!/usr/bin/env bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

if [ $# -lt 1 ]
then
        echo "USAGE find_and_rename.sh <root-directory>"
        exit
fi

file_list=`find $1 -type f`

for f in $file_list
do
        tmp=`echo $f | tr '[a-z]' '[A-Z]'`
        tmp2=`dirname $f`/`basename $tmp`

        mv $f $tmp2
done
IFS=$SAVEIFS



rikardoac ()
Ответ на: комментарий от olibjerd

сменить регистр

Регекспами

Ох уж эти линупсоиды.

anonymous ()

convmv --lower -f utf8 --notest path_to_dir

без --notest только покажет, что будет делать. -f utf8 рекомендуется для --lower.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.