Подтвердить что ты не робот

Пакетное переименование файлов

Я хочу, чтобы переименовать несколько файлов в каталоге, чтобы предыдущее число и hypen были удалены из имени файла.

Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name:         XXX_01_xxxx_20130730235001_00000000.NEW

Как это сделать с помощью команды linux?

4b9b3361

Ответ 1

Это должно сделать это:

rename 's/^[0-9]*-//;' *

Он получает от начала блок [0-9] (то есть числа) много раз, затем дефис - и удаляет его из имени файла.


Если rename не находится на вашем компьютере, вы можете использовать цикл и mv:

mv "$f" "${f#[0-9]*-}"

Test

$ ls
23-aa  hello aaa23-aa
$ rename 's/^[0-9]*-//;' *
$ ls
aa  hello aaa23-aa

Или:

$ ls
23-a  aa23-a  hello
$ for f in *;
> do
>   mv "$f" "${f#[0-9]*-}"
> done
$ ls
a  aa23-a  hello

Ответ 2

Я думаю, что эта команда будет лучше, если вы выполните следующую команду:

ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv

Здесь
ls * - список файлов в текущей папке
sed -e - выполняет выражение
p; - печатает старое имя файла
s/old-name/new-name/ - создать новое имя файла
xargs -n2 - обрабатывает два аргумента для mv
mv - получает два параметра и выполняет операцию перемещения

Рекомендация: перед выполнением mv проверьте, что вы делаете, это то, чего вы хотите достичь с помощью эха.

ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 echo

В следующем примере переименовываются

SCCF099_FG.gz5329223404623884757.tmp
SCCF099_FG.gz

ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 echo
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 mv

Ответ 3

Если первые числа всегда имеют одинаковую длину:

for F in *new ; do
    mv $F ${F:8}
done

${parameter:number} выполняет расширение подстроки - принимает строку, начинающуюся с 8-го символа.

В расширениях доступно множество других редактирований строк для обработки других случаев.

Ответ 4

используя renamer (Windows, Mac и Linux):

$ renamer --regex --find '\d+-(.*)' --replace '$1' *

Это приведет к удалению всех чисел и первого дефиса с начала всех файлов в текущем каталоге.

Ответ 5

vimv позволяет переименовывать несколько файлов с помощью возможностей редактирования текста Vim.

Ввод vimv открывает окно Vim, в котором перечислены все файлы, и вы можете выполнять сопоставление образцов, визуальный выбор и т.д., чтобы редактировать имена. После выхода из Vim файлы будут переименованы.

screencast в файле README показывает, как он решает вопрос с оригинальным плакатом.

[Отказ от ответственности: я автор этого инструмента]

Ответ 6

Это может показаться немного сложным, но оно довольно эффективно и хорошо работает на системах * nix и OSX. Он также действует рекурсивно, переименовывая файлы в текущем каталоге, а также в любых подкаталогах:

find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
cp temp1 temp2 && \
vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \
paste temp1 temp2 > temp3 && \
vi -c ":g/^/s//mv /" -c ":x" temp3 && \
sh ./temp3 && \
rm temp1 temp2 temp3

Вот разбивка того, что только что произошло:

В первой строке указано, что все файлы (find) находятся на всех файлах, начиная с тех, которые находятся в текущем каталоге (.), чье имя соответствует шаблону (-regex) из 7 номеров, а затем тире, за которым следует 0 или более символов "('.*/[0-9]\{7\}[-].*'), и напишите эти имена файлов и их соответствующие пути (-print) в файл под названием temp1 (> temp1). Обратите внимание, что директива -print, вероятно, не нужна в большинстве случаев, но это ничего не должно повредить.

find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \

Затем скопируйте (cp) содержимое temp1 в файл под названием temp2. ​​

cp temp1 temp2 && \

Затем откройте файл temp2 с помощью текстового редактора vi и дайте vi две команды (используя -c для обозначения каждой новой команды):

  • Команда # 1:
    • Найдите каждую строку temp2 (:g) для того же шаблона, который мы искали выше, за исключением этой группы времени результаты с помощью круглых скобок (\([0-9]\{7\}[-]\)\(.*\)).
    • Для каждой подходящей строки переместите курсор туда, где было найдено совпадение, и замените целое совпадение только второй группой совпадающего шаблона (\2).
  • Команда # 2:
    • Сохраните изменения, внесенные в temp2, и закройте файл (:x).

Результат:

 vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \

Теперь соедините строки из temp1 с параметрами temp2 (paste) и напишите каждую новую комбинированную строку в файл temp3 (> temp3).

paste temp1 temp2 > temp3 && \

Затем запустите vi, выполнив те же действия, что и выше, за исключением этого поиска по времени для начала каждой строки (^) внутри файла temp3 и добавьте mv и одно место сразу после него (mv).

vi -c ":g/^/s//mv /" -c ":x" temp3 && \

Затем выполните содержимое temp3 (./temp3) в качестве оболочки script (sh).

sh ./temp3 && \

Наконец, удалите (rm) каждый из временных файлов, которые мы создали в течение всего процесса.

rm temp1 temp2 temp3

Ответ 7

Вы можете использовать этот инструмент: rnm

Код, чтобы сделать то, что вы хотите:

rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'

-fo предназначен только для режима файла -dp - глубина директории (-1 означает неограниченную глубину).
-rs заменяет строку. \d+- regex заменяется пустой строкой.
-ss - это строка поиска, она ищет файлы с ^\d+- regex. (Это может быть опущено, хотя на экране будут напечатаны некоторые безобидные сообщения об ошибках).

Ответ 8

Мне действительно нравится что-то вроде "переименовать *.mp3 *.mp4".

Но ни один из других ответов не дал мне этого. Поэтому я написал программу haskell для этого.

https://hackage.haskell.org/package/batch-rename

С этим вы можете сделать:  batch_rename "DCIM *.jpg" "*.png"