Как сделать массовое переименование? - PullRequest
25 голосов
/ 06 января 2009

Мне нужно переименовать имена файлов, как это

transform.php?dappName=Test&transformer=YAML&v_id=XXXXX

только к этому

XXXXX.txt

Как я могу это сделать?

Я понимаю, что мне нужно более одной mv команды, потому что это не менее 25000 файлов.

Ответы [ 11 ]

48 голосов
/ 06 января 2009

Самое простое решение - использовать "ммв"

Вы можете написать:

mmv "long_name*.txt" "short_#1.txt"

Где "# 1" заменяется тем, что соответствует первому подстановочному знаку. Аналогично # 2 заменяется вторым и т. Д.

Итак, вы делаете что-то вроде

mmv "index*_type*.txt" "t#2_i#1.txt"

Чтобы переименовать index1_type9.txt в t9_i1.txt

mmv не является стандартом во многих дистрибутивах Linux, но его легко найти в сети.

18 голосов
/ 06 января 2009

Если вы используете zsh, вы также можете сделать это:

autoload zmv
zmv 'transform.php?dappName=Test&transformer=YAML&v_id=(*)' '$1.txt'
13 голосов
/ 06 января 2009

Вы пишете довольно простой сценарий оболочки, в котором самая сложная часть заключается в подборе имени.

Схема скрипта проста (синтаксис bash здесь):

for i in 'transform.php?dappName=Test&transformer=YAML&v_id='*
do
    mv $i <modified name>
done

Изменение имени имеет много вариантов. Я думаю, что самый простой - это, вероятно, одна строчка из awk типа

`echo $i  |  awk -F'=' '{print $4}'`

так ...

for i in 'transform.php?dappName=Test&transformer=YAML&v_id='*
do
    mv $i `echo $i |  awk -F'=' '{print $4}'`.txt 
done

обновление

Хорошо, как указано ниже, это не обязательно будет работать для достаточно большого списка файлов; * будет превышать ограничение длины командной строки. Итак, тогда вы используете:

$ find . -name 'transform.php?dappName=Test&transformer=YAML&v_id=*' -prune -print |
while read
do
    mv $reply `echo $reply |  awk -F'=' '{print $4}'`.txt 
done
5 голосов
/ 06 января 2009

Попробуйте команду переименовать

Или вы можете передать результаты ls в регулярное выражение perl.

4 голосов
/ 07 января 2009
find -name '*v_id=*' | perl -lne'rename($_, qq($1.txt)) if /v_id=(\S+)/'
4 голосов
/ 06 января 2009

Вы можете использовать все, что хотите для преобразования имени (perl, sed, awk и т. Д.). Я буду использовать однострочник Python:

for file in 'transform.php?dappName=Test&transformer=YAML&v_id='*; do 
    mv $file `echo $file | python -c "print raw_input().split('=')[-1]"`.txt;
done

Вот тот же скрипт полностью на Python:

import glob, os
PATTERN="transform.php?dappName=Test&transformer=YAML&v_id=*"

for filename in glob.iglob(PATTERN):
      newname = filename.split('=')[-1] + ".txt"
      print filename, '==>', newname
      os.rename(filename, newname)

Примечание: у вас была бы более простая жизнь, если бы вы сохранили страницы с нужным названием, захватывая их ...

1 голос
/ 13 августа 2017

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

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

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

0 голосов
/ 04 октября 2013
Команда

this renamer сделает это:

$ renamer --regex --find 'transform.php?dappName=Test&transformer=YAML&v_id=(\w+)' --replace '$1.txt' *
0 голосов
/ 25 декабря 2012

Это также должно работать:

prfx = 'transform.php? DappName = Тест & трансформатор = YAML & v_id ='

ls $ prfx * | sed s / $ prfx // | xargs -Ipsx mv "$ prfx" psx psx

0 голосов
/ 12 апреля 2011

Я бы использовал ren-regexp , который представляет собой Perl-скрипт, который позволяет очень легко переименовывать файлы.

21:25:11 $ ls
transform.php?dappName=Test&transformer=YAML&v_id=12345

21:25:12 $ ren-regexp 's/transform.php.*v_id=(\d+)/$1.txt/' transform.php*

  transform.php?dappName=Test&transformer=YAML&v_id=12345
1 12345.txt


21:26:33 $ ls
12345.txt
...