Пакетное переименование файлов с помощью Bash

Как 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

Ответ 1

Вы можете использовать функцию расширения bash

for i in *.pkg ; do mv "$i" "${i/-[0-9.]*.pkg/.pkg}" ; done

Котировки необходимы для имен файлов с пробелами.

Ответ 2

Если все файлы находятся в одном каталоге, последовательность

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

Ответ 3

Я сделаю что-то вроде этого:

for file in *.pkg ; do
    mv $file $(echo $file | rev | cut -f2- -d- | rev).pkg
done

предполагается, что весь ваш файл находится в текущем каталоге. Если нет, попробуйте использовать find, как описано выше Хавьером.

EDIT. Кроме того, эта версия не использует никаких bash -специфических функций, как и выше, что приводит к большей переносимости.

Ответ 4

лучше использовать 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

вычисление регулярного выражения остается как упражнение (как это имеет дело с именами файлов, которые включают пробелы)

Ответ 5

Это, похоже, работает, предполагая, что

  • все заканчивается на $pkg
  • Ваша версия # всегда начинается с "-"

отмените .pkg, затем отделите -..

for x in $(ls); do echo $x $(echo $x | sed 's/\.pkg//g' | sed 's/-.*//g').pkg; done

Ответ 6

У меня было несколько файлов *.txt, которые были переименованы в .sql в той же папке. ниже работал у меня:

for i in \`ls *.txt | awk -F "." '{print $1}'\` ;do mv $i.txt $i.sql; done

Ответ 7

Спасибо за ответы. У меня также была какая-то проблема. Перемещение файлов .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.