Ответ 1
Вы можете использовать функцию расширения bash
for i in *.pkg ; do mv "$i" "${i/-[0-9.]*.pkg/.pkg}" ; done
Котировки необходимы для имен файлов с пробелами.
Как Bash переименовать серию пакетов, чтобы удалить их номера версий? Я обошел с помощью expr
и %%
, но безрезультатно.
Примеры:
Xft2-2.1.13.pkg
становится Xft2.pkg
jasper-1.900.1.pkg
становится jasper.pkg
xorg-libXrandr-1.2.3.pkg
становится xorg-libXrandr.pkg
Вы можете использовать функцию расширения bash
for i in *.pkg ; do mv "$i" "${i/-[0-9.]*.pkg/.pkg}" ; done
Котировки необходимы для имен файлов с пробелами.
Если все файлы находятся в одном каталоге, последовательность
ls |
sed -n 's/\(.*\)\(-[0-9.]*\.pkg\)/mv "\1\2" "\1.pkg"/p' |
sh
выполнит вашу работу. Команда sed создаст последовательность команд mv, которые затем вы можете передать в оболочку. Лучше всего запустить трубопровод без тренировки | sh, чтобы убедиться, что команда делает то, что вы хотите.
Для повторной обработки через несколько каталогов используйте что-то вроде
find . -type f |
sed -n 's/\(.*\)\(-[0-9.]*\.pkg\)/mv "\1\2" "\1.pkg"/p' |
sh
Я сделаю что-то вроде этого:
for file in *.pkg ; do
mv $file $(echo $file | rev | cut -f2- -d- | rev).pkg
done
предполагается, что весь ваш файл находится в текущем каталоге. Если нет, попробуйте использовать find, как описано выше Хавьером.
EDIT. Кроме того, эта версия не использует никаких bash -специфических функций, как и выше, что приводит к большей переносимости.
лучше использовать sed
для этого, что-то вроде:
find . -type f -name "*.pkg" |
sed -e 's/((.*)-[0-9.]*\.pkg)/\1 \2.pkg/g' |
while read nameA nameB; do
mv $nameA $nameB;
done
вычисление регулярного выражения остается как упражнение (как это имеет дело с именами файлов, которые включают пробелы)
Это, похоже, работает, предполагая, что
отмените .pkg, затем отделите -..
for x in $(ls); do echo $x $(echo $x | sed 's/\.pkg//g' | sed 's/-.*//g').pkg; done
У меня было несколько файлов *.txt
, которые были переименованы в .sql
в той же папке.
ниже работал у меня:
for i in \`ls *.txt | awk -F "." '{print $1}'\` ;do mv $i.txt $i.sql; done
Спасибо за ответы. У меня также была какая-то проблема. Перемещение файлов .nzb.queued в файлы .nzb. В именах файлов были пробелы и другие трещины, и это решило мою проблему:
find . -type f -name "*.nzb.queued" |
sed -ne "s/^\(\(.*\).nzb.queued\)$/mv -v \"\1\" \"\2.nzb\"/p" |
sh
Он основан на ответе Диомидиса Спинеллиса.
Регулярное выражение создает одну группу для всего имени файла и одну группу для части до .nzb.queued, а затем создает команду перемещения оболочки. С цитируемыми строками. Это также позволяет избежать создания цикла в оболочке script, поскольку это уже сделано sed.