Дано: в каталоге лежат несколько файлов с произвольными именами (с возможным содержанием пробелов).
Задача №1: в цикле добавить к именам файлов в конец слово "new", чтобы получились файлы типа "имя_файлаnew.расширение".
Задача №2: в цикле сделать обратное действие, т.е. у файлов с "new" на конце имени убрать это "new" на конце имени.Мои потуги:
Задача №1:
for i in ...
do
mv '$i' '$i.new'
doneзадачу №2 вообще не знаю как решить :(
помогите, буду очень благодарен!
>[оверквотинг удален]
> Задача №1: в цикле добавить к именам файлов в конец слово "new",
> чтобы получились файлы типа "имя_файлаnew.расширение".
> Задача №2: в цикле сделать обратное действие, т.е. у файлов с "new"
> на конце имени убрать это "new" на конце имени.
> Мои потуги:
> Задача №1:
> for i in ...
> do
> mv '$i' '$i.new'
> doneИ оно у вас работает? С одинарными кавычками?
> задачу №2 вообще не знаю как решить :(
Например, так:
for i in *; do
mv -vf -- "$i" "$(echo "$i" | sed 's|\.new$||')"
done
> И оно у вас работает? С одинарными кавычками?в том-то и дело что не работает)
>[оверквотинг удален]
> Задача №2: в цикле сделать обратное действие, т.е. у файлов с "new"
> на конце имени убрать это "new" на конце имени.
> Мои потуги:
> Задача №1:
> for i in ...
> do
> mv '$i' '$i.new'
> done
> задачу №2 вообще не знаю как решить :(
> помогите, буду очень благодарен!for file in /dir/*; do mv ${file} ${file}.new; done
for file in /dir/*; do mv ${file} ${file%...}; doneПример.
mkdir ~/dir
touch ~/dir/some\ file
for file in ~/dir/*; do mv ${file} ${file}.new; done
for file in ~/dir/*; do mv ${file} ${file%.???}; done
>[оверквотинг удален]
>> done
>> задачу №2 вообще не знаю как решить :(
>> помогите, буду очень благодарен!
> for file in /dir/*; do mv ${file} ${file}.new; done
> for file in /dir/*; do mv ${file} ${file%...}; done
> Пример.
> mkdir ~/dir
> touch ~/dir/some\ file
> for file in ~/dir/*; do mv ${file} ${file}.new; done
> for file in ~/dir/*; do mv ${file} ${file%.???}; done1) на сколько я понял, сложность была в том, чтобы вставить суффикс между именем файла и расширением файла, а не просто дописать в конец, то есть чтобы расширение файла не поменялось
2) использование ${file} приведёт к ошибке для файлов, содержащих пробел, нужно "${file}"
>[оверквотинг удален]
>> for file in /dir/*; do mv ${file} ${file%...}; done
>> Пример.
>> mkdir ~/dir
>> touch ~/dir/some\ file
>> for file in ~/dir/*; do mv ${file} ${file}.new; done
>> for file in ~/dir/*; do mv ${file} ${file%.???}; done
> 1) на сколько я понял, сложность была в том, чтобы вставить суффикс
> между именем файла и расширением файла, а не просто дописать в
> конец, то есть чтобы расширение файла не поменялось
> 2) использование ${file} приведёт к ошибке для файлов, содержащих пробел, нужно "${file}"Пример.
mkdir ~/dir
touch ~/dir/some\ file
touch ~/dir/some\ file.extension
cd ~/dir
export addword=".new"
for file in *; do
case ${file##*.} in
${file}) echo "file not have extension";;
*) mv -v ${file} ${file%.*}${addword}.${file##*.};;
esac;
donefor file in *; do
case ${file##*.} in
${file}) echo "file not have extension";;
*) mv -v ${file} ${file%${addword}.*}.${file##*.};;
esac;
doneСпасибо за замечание, невнимателен. Сложностей здесь нет, достаточно использовать "Parameter Expansion".
>использование ${file} приведёт к ошибке для файлов, содержащих пробел, нужно "${file}"Прошу внимательней посмотреть на пример, some\ file содержит пробел. В использвуемой конструкции экранирование не требуется.
Пример.
file=file\ name\ with\ blank
touch ${file}
mv -v ${file} ${file}.new
«file name with blank» -> «file name with blank.new»Примечание.
В скрипте, можно предусмотреть как необходимо обрабатывать файлы без расширений (показано в примере).
И как следует поступать с определёнными расширениями, например, file.tar.gz
> Прошу внимательней посмотреть на пример, some\ file содержит пробел. В использвуемой конструкции
> экранирование не требуется.
> Пример.
> file=file\ name\ with\ blank
> touch ${file}
> mv -v ${file} ${file}.new
> «file name with blank» -> «file name with blank.new»без кавычек ошибку выдаёт:
$ file=file\ name\ with\ blank
$ touch ${file}
$ mv -v ${file} ${file}.new
mv: target `blank.new' is not a directoryто есть файл с пробелом воспринимается за 4 файла.
я не знаю, что у вас за шелл, но мои (bash,dash) требуют кавычек вокруг ${file}
>[оверквотинг удален]
>> mv -v ${file} ${file}.new
>> «file name with blank» -> «file name with blank.new»
> без кавычек ошибку выдаёт:
> $ file=file\ name\ with\ blank
> $ touch ${file}
> $ mv -v ${file} ${file}.new
> mv: target `blank.new' is not a directory
> то есть файл с пробелом воспринимается за 4 файла.
> я не знаю, что у вас за шелл, но мои (bash,dash) требуют
> кавычек вокруг ${file}Извините, особенность shell'а. POSIX требует экранирование.
Решение первой задачи:
for ii in *;do mv "$ii" "${ii%.*}.new.${ii##*.}";done
> Решение первой задачи:
> for ii in *;do mv "$ii" "${ii%.*}.new.${ii##*.}";doneрешение обратной задачи:
for ii in *;do name=$(echo "${ii%.*}" | sed "s|\.new$||") && mv "$ii" "$name.${ii##*.}";done
>>${ii%.*}.new.${ii##*.}"
> name=$(echo "${ii%.*}" | sed "s|\.new$||")А чего второе без sed-а не сделал?
>>>${ii%.*}.new.${ii##*.}"
>> name=$(echo "${ii%.*}" | sed "s|\.new$||")
> А чего второе без sed-а не сделал?хорошее замечание, вот
for ii in *;do mv -- "$ii" "${ii%.new.*}.${ii##*.}";done
> Решение первой задачи:
> for ii in *;do mv "$ii" "${ii%.*}.new.${ii##*.}";done
> решение обратной задачи:
> for ii in *;do mv -- "$ii" "${ii%.new.*}.${ii##*.}";doneПрошу прощения, а можно вас попросить краткий комментарий дать, например зачем двойной тире во второй операции а также двойной # в обеих если вас не затруднит :)
>> Решение первой задачи:
>> for ii in *;do mv "$ii" "${ii%.*}.new.${ii##*.}";done
>> решение обратной задачи:
>> for ii in *;do mv -- "$ii" "${ii%.new.*}.${ii##*.}";done
> to sany
> Прошу прощения, а можно вас попросить краткий комментарий дать, например зачем двойной
> тире во второй операции а также двойной # в обеих если
> вас не затруднит :)mv --
программа mv написанна с использование функции getopt, для разбора аргументов, что позволяет указать завершение параметров программы, т.е все последйющие аргументы будут восприниматься как не-параметры.
Пример.
toch -- file -f
mv -f -- file file.new # -f является параметром программы mv
mv -- -f -f.new # -f является файлом${ii##*.} ${ii%.*}
Это "Parameter Expansion" или "Parameter substitution", "Раскрытие/подстановка параметров".
${параметр(%,%%,#,##)шаблон_из_регулярных_выражений}
${параметр#шаблон} - подставляет значение параметра, в котором из головной части удалён наименьший фрагмент, удовлетворяющий шаблону.
${параметр##шаблон} - подставляет значение параметра, в котором из головной части удалён наибольший фрагмент, удовлетворяющий шаблону.
${параметр%шаблон} - подставляет значение параметра, в котором из хвостовой части удалён наименьший фрагмент, удовлетворяющий шаблону.
${параметр%%шаблон} - подставляет значение параметра, в котором из хвостовой части удалён наибольший фрагмент, удовлетворяющий шаблону.
Пример
export ii=new.file.newecho ${ii#*.}
file.newecho ${ii##*.}
newecho ${ii%.*}
new.fileecho ${ii%.*}
newhttp://ru.wikipedia.org/wiki/Регулярные_выражения
P.s.
>у вас за шелл
>можно вас попросить/вас/Вас/
>>> Решение первой задачи:
>>> for ii in *;do mv "$ii" "${ii%.*}.new.${ii##*.}";done
>>> решение обратной задачи:
>>> for ii in *;do mv -- "$ii" "${ii%.new.*}.${ii##*.}";done
>> to sany
>> Прошу прощения, а можно вас попросить краткий комментарий дать, например зачем двойной
>> тире во второй операции а также двойной # в обеих если
>> вас не затруднит :)
> ${параметр(%,%%,#,##)шаблон_из_регулярных_выражений}это не регулярные выражения, это Shell Patterns
подробнее "Подстановка имен файлов" http://www.opennet.me/man.shtml?topic=bash&category=1#lbBD
>[оверквотинг удален]
>>>> for ii in *;do mv "$ii" "${ii%.*}.new.${ii##*.}";done
>>>> решение обратной задачи:
>>>> for ii in *;do mv -- "$ii" "${ii%.new.*}.${ii##*.}";done
>>> to sany
>>> Прошу прощения, а можно вас попросить краткий комментарий дать, например зачем двойной
>>> тире во второй операции а также двойной # в обеих если
>>> вас не затруднит :)
>> ${параметр(%,%%,#,##)шаблон_из_регулярных_выражений}
> это не регулярные выражения, это Shell Patterns
> подробнее "Подстановка имен файлов" http://www.opennet.me/man.shtml?topic=bash&category=1#lbBDСпасибо за замечание. Я не знаяю "Shell Patterns",
${параметр(%,%%,#,##)шаблон_из_регулярных_выражений}
${параметр(%,%%,#,##)шаблон_из_регулярных_выражений_shell}
${параметр(%,%%,#,##)pattern_matching}
спасибо большое, друзья!! завтра попробую - отпишусь о результате!!! 3 разных варианта предложено - како-то точно подойдёт :)
ещё раз благодарю!!!
>[оверквотинг удален]
> Задача №2: в цикле сделать обратное действие, т.е. у файлов с "new"
> на конце имени убрать это "new" на конце имени.
> Мои потуги:
> Задача №1:
> for i in ...
> do
> mv '$i' '$i.new'
> done
> задачу №2 вообще не знаю как решить :(
> помогите, буду очень благодарен!1.
# rename .jpg .new.jpg *.jpg
2.
# rename .new.jpg .jpg *.jpgThe rename command is part of the util-linux package
and is available from ftp://ftp.kernel.org/pub/linux/utils/util-linux