Здравствуйте. Я знаю, что здесь существуют подобные темы, но быть честным я не нашел решение для своей проблемы. Я также проверил stackoverflow, но никакой результат.
Я должен сделать сценарий удара, который будет менять имена файлов от ниже до верхнего ИЛИ от верхнего для понижения через параметры в командной строке. Таким образом, когда я вставил командную строку:
./bashScript, ниже верхний
затем все файлы в каталоге должны измениться от ниже до верхнего регистра.
Я должен также добавить 3-й параметр, который позволит мне изменить только один определенный файл. Так, например, я должен смочь включения командной строки:
./bashScript понижают верхнее имя файла
Я создал что-то вроде этого:
#!/bin/bash
if test "$1" = "lower" && test "$2" = "upper"
then
for file in *; do
if [ $0 != "$file" ] && [ $0 != "./$file" ]; then
mv "$file" "$(echo $file | tr [:lower:] [:upper:])";
fi
fi
done
elif test "$1" = "upper" && test "$2" = "lower"
then
for file in *; do
if [ $0 != "$file" ] && [ $0 != "./$file" ]; then
mv "$file" "$(echo $file | tr [:upper:] [:lower:])";
fi
done
fi
Но это не работает вообще. И я не знаю, как сделать этот 3-й параметр для одного определенного файла. Я был бы благодарен, если кто-либо мог бы написать код или добавить к моему коду надлежащие проблемы.
Заранее спасибо.
Взгляните на это:
#!/bin/bash
if [[ "$1" == "lower" && "$2" == "upper" ]] ; then
EXPRESSION="y/a-z/A-Z/"
elif [[ "$1" == "upper" && "$2" == "lower" ]] ; then
EXPRESSION="y/A-Z/a-z/"
else
echo "Usage: $0 lower upper [file] OR $0 upper lower [file]"
exit 1
fi
if [[ -z "$3" ]] ; then
shopt -s dotglob
rename "$EXPRESSION" ./*
else
rename "$EXPRESSION" "$3"
fi
Необходимо обычно использовать [[ ... ]]
двойные скобки для условных выражений в Bash. В них можно использовать, например. ==
выдерживать сравнение для строкового равенства (с обеими заключенными в кавычки сторонами), или &&
объединить два условия с логическим И.
Затем я решил использовать rename
управляйте вместо своей конструкции с echo
, tr
и mv
. Это берет "выражение Perl" в качестве первого аргумента и любого количества имен файлов (как, например, результат шарика оболочки) после этого и переименует все файлы соответствия соответственно.
Выражение Perl, которое изменяет все строчные буквы на имя к прописным буквам, например. y/a-z/A-Z/
. y
команда и означает переводить все символы. a-z
нотация, которая соответствует всем строчным латинским символам, A-Z
для верхнего регистра. В зависимости от аргументов сценария мы храним или выражение для преобразования в верхний - или в нижний регистр в переменной оболочки $EXPRESSION
.
Затем мы проверяем, был ли третий аргумент сценария дан (-z
условная проверка Bash, которая верна, если строка пуста). В противном случае мы звоним rename
команда с нашим сохраненным выражением и a ./*
как окружают шарик для соответствия всем файлам в текущем каталоге. dotglob
опция оболочки, которую мы включили, прежде чем это удостоверяется, что это также соответствует скрытым файлам именам, которые запускаются с точки, иначе они были бы опущены. Однако, если третий аргумент сценария был дан, мы передаем тот как аргумент.
Я думал, что добавлю свои два пенса, стоящие, немного отличающееся взятие на ответе Командующего Байта.
#! /bin/bash
case $1 in
upper)
# check second argument to process a file if one given or the whole directory
if [[ $2 > '' ]] #check if the second parameter is used (filename)
then
if [ -f $2 ] #check if the file exists
then
mv "$2" "$(echo $2 |tr [:lower:] [:upper:])"
else
echo "$2 does not exist"
fi
else
# process the whole directory
for file in *
do
if [ $0 != "$file" ] && [ $0 != "./$file" ]
then
mv "$file" "$(echo $file | tr [:lower:] [:upper:])"
fi
done
fi;;
lower)
# check second argument to process a file if one given or the whole directory
if [[ $2 > '' ]]
then
if [ -f $2 ] #check if the file exists
then
mv "$2" "$(echo $2 |tr [:upper:] [:lower:])"
else
echo "$2 does not exist"
fi
else
#process the whole directory
for file in *;
do
if [ $0 != "$file" ] && [ $0 != "./$file" ]
then
mv "$file" "$(echo $file | tr [:upper:] [:lower:])"
fi
done
fi;;
--help)
echo "Usage: $0 lower to lowercase entire directory "
echo "Usage: $0 uppper to uppercase entire dirctory "
echo "Usage: $0 lower [file] or upper [file] for a specific file"
exit 1;;
esac