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

Как сделать массовое переименование?

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

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

только для этого

XXXXX.txt

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

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

4b9b3361

Ответ 1

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

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

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, но его легко найти в сети.

Ответ 2

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

autoload zmv
zmv 'transform.php?dappName=Test&transformer=YAML&v_id=(*)' '$1.txt'

Ответ 3

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

Контур script прост (синтаксис bash здесь):

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

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

`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

Вы можете использовать все, что хотите, чтобы преобразовать имя (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

Здесь же script полностью в 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)

Боковое замечание: вам было бы легче спасать страницы с правильным именем, хватая их...

Ответ 6

find -name '*v_id=*' | perl -lne'rename($_, qq($1.txt)) if /v_id=(\S+)/'

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

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

$ renamer --regex --find 'transform.php?dappName=Test&transformer=YAML&v_id=(\w+)' --replace '$1.txt' *

Ответ 11

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

Но если вы можете запустить Total Commander, сделайте следующее:

  • Выберите все файлы с * и нажмите ctrl-M

  • В поле Поиск вставьте "transform.php? dappName = Test & transformer = YAML & v_id ="

    (Оставьте Заменить пустым)

  • Нажмите Начать

Это не намного проще. Вы также можете переименовать, используя регулярные выражения, в этом диалоговом окне, и вы увидите предварительный просмотр того, как ваши файлы будут переименованы в реальном времени.