2013-11-30 5 views
2

У меня около 1000 файлов, которые мне нужно переименовать. Текущий формат:Пакетное переименование файлов в Linux

exten-B12345678910-C45679891254-D12345645-E4578981-G6546525.1.wav 

Я хотел бы удалить exten- & -G6546525.1. «Exten-» часть имени файла одинакова во всех файлах, но часть -G6546525.1 отличается во всех файлах. Есть ли сценарий для удаления обеих частей и просто оставить B12345678910-C45679891254-D12345645-E4578981.wav в качестве имени файла?

Надеюсь, я прояснил ситуацию.

+0

Лучший способ сделать это зависит от используемой ОС. sed - почти наверняка неправильный подход. Так скажите нам ОС и, если это UNIX, оболочка, которую вы используете. Обновите теги для соответствия. –

+0

Все ли файлы в одной папке или находятся в разных подпапках? И как «другой» является частью '-G6546525.1'? Являются ли они одинаковыми, кроме цифр? – lurker

+0

Во-первых, большое спасибо за быстрые ответы. – user3052324

ответ

0
for f in "exten-*-G*.wav" ; do 
    mv "$f" "$(echo $f | sed 's/exten-\(.*\)-[^-]*\.wav/\1.wav/')" 
done 

Это предназначен для работы на указанных форматов файлов и, возможно, не в случае подстановка символов и т.д.

+0

не удастся, если имя файла содержит пробелы или символы подстановки или ... –

+0

@ EdMorton да, я согласен. OP был довольно специфичен в отношении формата имени файла, поэтому я предположил, что это узкое определение. – lurker

+0

Достаточно справедливо, стоит упомянуть, если есть неочевидные оговорки. Вы можете обойти множество проблем, просто указав свою переменную оболочки соответствующим образом (например, «echo» $ f «' вместо 'echo $ f') и другие, используя printf вместо echo. –

0

Вот как получить части имени файла, который вы хотите с помощью Баш или Ksh:

$ x="exten-B12345678910-C45679891254-D12345645-E4578981-G6546525.1.wav" 
$ echo "$x" 
exten-B12345678910-C45679891254-D12345645-E4578981-G6546525.1.wav 

$ y="${x#*-}" 
$ echo "$y" 
B12345678910-C45679891254-D12345645-E4578981-G6546525.1.wav 

$ z="${y%-*}" 
$ echo "$z" 
B12345678910-C45679891254-D12345645-E4578981 

чтобы уточнить, как использовать выше для переименования файлов:

for x in * 
do 
    y="${x#*-}" 
    mv -- "$x" "${y%-*}.wav" 
done 

Обратите внимание, что дру могут быть более краткими методами, например. zsh имеет несколько мощных конструкций, а некоторые оболочки имеют команду rename.

+0

frig, я ошеломлен быстрыми ответами, но я не прояснил; это фактическое имя файла: exten-03333456781-07548994578-20131130-135035-1385819435.41.wav. Вы можете понять, что это запись из файла freepbx/asterisk. Я добавил в B, C, D, E, G изначально как попытку идентифицировать каждую часть имени файла для вас.Пожалуйста, извините меня за то, что я не linux грамотный, позорно начал свою карьеру на арене microsoft: (# – user3052324

+0

@ user3052324 вы можете использовать метод Ed для создания имени файла, который вы хотите, и использовать оболочку 'for' для выполнения переименования. – lurker

+0

@ user3052324 Понял, я обновил свой ответ, чтобы сделать приложение явным. –

0

Я делаю такую ​​групповую работу с использованием PHP и phpSecLib2, работающих на моем Linux-поле.

Использование SecLib, запуск SSH-соединения в поле Linux, на которое вы хотите переименовать файлы, и запустить «ls» внутри папки. Затем взорвите список файлов в массив PHP, за которым следует a для каждого цикла.

Пример кода следующим образом (предполагается, что местоположение файла на сервер в/главная/пользователя/файлы/и расположение сервера локальный):

<?php 

include('Net/SSH2.php'); 

$ssh = new Net_SSH2('localhost'); 
if (!$ssh->login('SSHUSER', 'SSHPASS')) { 
       exit('Login Failed'); 
} 

$filelist = $ssh->exec("cd /home/user/files;ls"); 

$filearray = explode("\n", $filelist); 

foreach ($filearray as $key) { 

    $newarray = explode("-", $key); 
    $newfile = $newarray[1] . $newarray[2] . $newarray[3] . $newarray[4] . ".wav"; 
    $newfile = (string)$newfile; 
    $oldfile = (string)$key; 

    $rename = "cd /home/user/files;mv '" . $oldfile . "' '" . $newfile . "'"; 
    $rename = (string)$rename; 
    $runrename = $ssh->exec($rename); 
} 
echo "Done!"; 
?> 

Приведенный выше код должен работать с минимальными изменениями (логин/пароль и изменение местоположения папки).

+0

В качестве альтернативы вы могли бы написать почти идентичный скрипт в python, используя str.split – Xarus

+0

Это, похоже, противоречит общепринятой мудрости, что вы никогда не должны пытаться анализировать вывод 'ls' (google it), и если я правильно понимаю скрипт, он не цитирует имена файлов на 'mv' и поэтому открыт для различных ошибок с помощью globbing и других символов. –

+0

Исправлено - забыли' (string) '' ключ '' и обновить '$ key' в' $ oldfile' в разделе 'mv'. Что касается синтаксического анализа' ls' - есть разница между синтаксическим анализом 'ls' и анализом вывода' ls'. Я делал это через PHP для Y уши теперь без проблем. – Xarus

Смежные вопросы