2016-07-29 3 views
0

Iam пытается сценарий оболочки, который переименует все файлы в текущем каталоге, чье имя содержит символы верхнего регистра во все строчные буквы. Например, если каталог содержит файл с именем CoUnt.c, его следует переименовать в count.c.переименуйте все файлы в текущем каталоге, имя которого совпадает с верхним регистром во всем нижнем регистре

for f in *; 
do 
if [ -f "$f" ]; then 
tr 'A-Z' 'a-z' 
fi 
done 

но не работает. есть ли какое-нибудь лучшее решение для этого?

+0

попробуйте, http://stackoverflow.com/questions/20253584/linux-rename-files-to-uppercase –

ответ

2

Проблема tr принимает значения от stdin. Поэтому для того, чтобы верхний Переводить ниже каждого файла, вы могли бы сделать что-то вроде:

#!/bin/sh 

for f in * 
do 
    [ -f "$f" ] || continue 
    flc=$(echo "$f" | tr 'A-Z' 'a-z')   ## form lower-case name 
    [ "$f" != "$flc" ] && echo mv "$f" "$flc" 
done 

(примечание: удалить echo до того mv фактически переместить файлы после того, как вы удовлетворены работой)

2

Вы не передаете какие-либо данные в программу tr, и вы также не получаете какой-либо вывод.

Если вы используете sh:

for f in *[A-Z]* 
do 
    if [ -f "$f" ]; then 
     new_name=$(echo "$f"|tr 'A-Z' 'a-z') 
     mv "$f" "$new_name" 
    fi 
done 

Примечание отступы - это делает код легче читать.

Если вы используете bash нет никакой необходимости использовать внешнюю программу, как tr, вы можете использовать расширение Баша:

for f in *[A-Z]* 
do 
    if [[ -f $f ]]; then 
     new_name=${f,,*} 
     mv "$f" "$new_name" 
    fi 
done 
+0

Нет обмана с бахизмами! ';-)', но мне нравится предел имен файлов, содержащих верхний регистр. –

+1

@ DavidC.Rankin: честно, но я сначала дал решение POSIX :-) – cdarke

1

Следующий код работает отлично.

for f in * 
do 
if [ -f $f ]; then 
    echo "$f" | tr 'A-Z' 'a-z' >/dev/null 
fi 
done 
2

Поскольку я не могу добавить комментарий размещения здесь, Используется СЕПГ и это работает для меня

#!/Bin/Баш

for i in * 
do 
if [ -f $i ] 
then 
kar=$(echo "$i" | sed 's/.*/ \L&/') 
mv "$i" "$kar" 
done 
+0

Вы должны добавить двойные кавычки вокруг всех обращений к переменным, если имена файлов содержат пробелы, поэтому '' $ i "' и '" $ kar «'. –

1

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

Вы можете использовать его с регулярным выражением Perl:

rename 'y/A-Z/a-z/' * 

Имеются документы и примеры here.

+0

'rename (1)' специфичен для Linux, и не все версии поддерживают параметры, которые вы показываете. – cdarke

+0

@cdarke AFAIK, это Perl-скрипт, который работает на Linux, Unix и OS X и Windows, если установлен Perl. Я считаю, что второй формат/синтаксис, который я предложил, поддерживается на всех этих платформах. –

+0

Команда rename написана на C. Она является частью пакета util-linux и доступна на ftp://ftp.kernel.org/pub/linux/utils/util-linux/.Интерфейс ядра 'rename (2)' является базовым API, и внутри него встроено Perl, но это не так. Я запускаю OS X с установленным Perl и нет утилиты командной строки переименования. – cdarke

Смежные вопросы