Как сделать массовое переименование?
Мне нужно переименовать имена файлов, подобные этому
transform.php?dappName=Test&transformer=YAML&v_id=XXXXX
только для этого
XXXXX.txt
Как я могу это сделать?
Я понимаю, что мне нужно больше одной команды mv
, потому что они содержат не менее 25000 файлов.
Ответы
Ответ 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
Ответ 4
Попробуйте переименовать команду
Или вы можете передать результаты ls в регулярное выражение perl.
Ответ 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 = Тест &ер;? Трансформатор = 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 ="
(Оставьте Заменить пустым)
-
Нажмите Начать
Это не намного проще.
Вы также можете переименовать, используя регулярные выражения, в этом диалоговом окне, и вы увидите предварительный просмотр того, как ваши файлы будут переименованы в реальном времени.