LINUX.ORG.RU

Помогите со скриптом


0

0

Потребовалось заменить кусок имени файла во всех файлах 
рекурсивно в директории. Намучавшись с файлами в имени 
которых есть пробелы и спец символы, я сдался и в целях 
экономии времени написал на том на чем смог. Теперь в целях 
повышения образованности мне интересно узнать как это 
правильно сделать с помощью bash, sed, mv, и возможно find. Для файлов без пробелов на bash я написал. С пробелами не справился и написал это:

import org.apache.commons.io.*;
import java.util.*;
import java.util.regex.*;
import java.io.*;

public class Replace {
    public static void main(String[] args) {
        List<File> files = (List) FileUtils.listFiles(new File("/home/zort/something"), null, true);
        Pattern p = Pattern.compile("old");

        for (File a : files) {
            Matcher m = p.matcher(a.toString());
            String asdf = m.replaceAll("new");
            a.renameTo(new File(asdf));
            System.out.println(asdf);
        }
    }
}

просветите меня.

ЗЫ знаю что ламер - у меня на капитальное изучение баша 
времени не нашлось.

Ответ на: комментарий от Jini

Кроме символа <ENTER> в имени файла.

touch 'aaa
bbb'

sdio ★★★★★
()
Ответ на: комментарий от zort

> т.е. твой скрипт универсален ? для всеx допустимых в линуксе имен файлов ?

Хехе, нет, не универсален.

[tmp]> touch 'q
> w'
[tmp]> ls
q?w
[tmp]> ../rename.sh w d .
mv: невозможно выполнить stat для `./q': Нет такого файла или каталога
mv: невозможно выполнить stat для `w': Нет такого файла или каталога
[tmp]> ls
q?w

:)

perl от sdio работает 

Jini ★★
()
Ответ на: комментарий от Jini

> perl от sdio работает 

Упс, нет, тоже не работает.

[tmp]> ls -1
q?w
[tmp]> ls -1 | perl -ne 'chomp; $from="$_"; rename "$from", "$_" if (s/w/e/);'
[tmp]> ls -1
q?w

Jini ★★
()
Ответ на: комментарий от Jini

эээх , недавно я доказывал что unix-вей и пайпы не рулят из эффективности,тогда я ещё не знал что они настолько не рулят из-за имен файлов:

http://www.linux.org.ru/jump-message.jsp?msgid=1832144#1835735 http://www.linux.org.ru/jump-message.jsp?msgid=1832144#1835883

здесь даже сказал что perl python рулят

http://www.linux.org.ru/jump-message.jsp?msgid=1832144#1835883

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

zort
() автор топика
Ответ на: комментарий от zort

zort (*) (22.03.2007 0:43:59)

Да, дорогой, та тема тебя похоже хорошо задела.. ;)

>и с каждым днём

И в один прекрасный день ты наконец вернешься на землю обетованную - в венду. :)

anonymous
()
Ответ на: комментарий от anonymous

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

zort
() автор топика

>у меня на капитальное изучение баша времени не нашлось.

Тебе не кажется, что твое поведение неэтично?

Поражает легкость, с которой остальные участнини клюнули на эту дышовку.. =))

Меня ты НИ В ЧЕМ не убедил.. :Р

Хочешь я тоже из хрена высосу 1000 и 1 аргумент где жаба и твой любимый виндусвей совершенно несостоятельны?

Хочешь научу давать нормальные имена файлам?

Желаешь, чтобы баш тебе еще пиво наливал и *инет делал?

Не возражаешь проснуться и увидеть _реальные_ задачи?

Не откажешься от пересадки безнадежно похаваного моска?

anonymous
()
Ответ на: комментарий от zort

>провоцировать я уже решил потом. честно.

Меня мало интересует, что ты там делал до своего первого поста, и, я позвонил Патрегу, он говорит, что ты лжешь. %)

anonymous
()
Ответ на: комментарий от Jini

жаба из первого поста переименовала энтер.

я не против юникс вея на практике, я против него "теоретически".

zort
() автор топика
Ответ на: комментарий от anonymous

я не такой подлый, а ответы которые дали manntes jini и sdio меня вполне устроили.

zort
() автор топика
Ответ на: комментарий от zort

>я против него "теоретически".

Твои имена файлов и являются теоретическим результатом нетеоретической безграмотности.

anonymous
()
Ответ на: комментарий от anonymous

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

спорить не буду,от-части я создавал этот пост, для того чтобы быть увереным, что ругаю u-way не зря.

zort
() автор топика
Ответ на: комментарий от anonymous

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

а то что я безграмотый в bash,я и отрицать не буду.

zort
() автор топика
Ответ на: комментарий от zort

>нужно писать дополнительный код

Ну дык, хоть не надо jvm тащить. :)

anonymous
()
Ответ на: комментарий от zort

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

zort
() автор топика
Ответ на: комментарий от anonymous

>Хочешь я тоже из хрена высосу 1000 и 1 аргумент где жаба и твой любимый виндусвей совершенно несостоятельны?

жаба вабще сакс для таких задач, и я её так и не позиционировал. слишком много буков набирать.

я скорее про u-way vs python,perl

под виндами не сижу потому что закрытая архитектура, здесь я хоть как что вещи делать могу.

zort
() автор топика
Ответ на: комментарий от zort

Ну дык перл и есть для таких случаев, когда bash awk sed вдруг недостаточно.. Не вижу vs м-ду unix-вэй и перлом.

anonymous
()
Ответ на: комментарий от anonymous

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

zort
() автор топика
Ответ на: комментарий от anonymous

>unix-вэй и перлом.

перл это соединение модулей внутри пространства языка, а u-w это через пайпы в разных процессах, поэтому перл совместим с u-w настолько насколько умеет читать/писать stdin/out. никто не будет конектить перл с перлом через пайп.

zort
() автор топика
Ответ на: комментарий от anonymous

если я не буду повторяться , то u-w фрики(т.е те кто кричит 'u-w это наше всё') будут себя воспроизводить дальше.

а повторяться мне действительно надоело, но здесь продолжают советовать bash sed awk, даже там где они на самом деле не уместны.

sun-ch мне даже один раз посоветовал bashем и awk выполнять чисто гуйную задачу по расфасовке файлпомойки - ещё одна распатроненная проблема - отрицание гуйни, мышки ,и дреэг энд дропа.

zort
() автор топика
Ответ на: комментарий от anonymous

>Поражает легкость, с которой остальные участнини клюнули на эту дышовку.. =))

Мне было интересно, а половые трудности автора, пусть соответствующий анонимный доктор рассматривает.

sdio ★★★★★
()

Вот же блин, такой флейм пропустил, а ведь моя любимая тема. :) Короче говоря, твой вариант на жабе тоже неправильный, так как он паттерн и в именах поддиректорий найдёт и попытается переименовать. А вообще ничего плохого в жабе я тут не вижу, раз она тебе привычнее. шеллы при работе с именами файлов всё же традиционно рассчитаны на то, что эти имена хорошие, тут ничего особенно не сделаешь. Я бы это на перле написал, с File::Find или find -print0 и уже чтением из перла.

Например так:

find dir -type f -print0 |./rename.pl, где rename.pl щас запощу.

Что касается unix way, то он не заключается в том, чтобы использовать менее подходящие для конкретной задачи инструменты, чем более подходящие. :)

Teak ★★★★★
()
Ответ на: комментарий от Teak

#!/usr/bin/perl -w
use strict;
$/="\0";
while(<>) {
        chomp;
        next unless -f $_;
#       s|/$||;
        die "bad input" unless m|^(.+)/([^/]+)$|;
        my ($dirname, $fname) = ($1, $2);
        my $newfname = $fname;
        $newfname =~ s/w/q/g;
        next if $newfname eq $fname;
        rename "$dirname/$fname", "$dirname/$newfname"
                or die "can't rename [$fname] to [$newfname] in [$dirname]";
}

Teak ★★★★★
()
Ответ на: комментарий от Teak

а вообще в состав перла входит скриптик rename, с ним делается примерно так (не проверял, просто ман прочитал): find . -print0 |xargs -0 rename 's/q/w/g'

проще вроде бы некуда, и должен корректно отработать для любых имён.

Teak ★★★★★
()
Ответ на: комментарий от Teak

то есть find -type f конечно же в этом случае.

Teak ★★★★★
()
Ответ на: комментарий от Teak

>поддиректорий найдёт и попытается переименовать.

я знаю об этом, но мне тогда не до этого было.

zort
() автор топика
Ответ на: комментарий от Teak

да, sdio уже посоветовал, а про -print0 я в мане давно прочитал (пост выше есть) но про то что rename есть, ещё тогда не знал.

zort
() автор топика
Ответ на: комментарий от Teak

спасибо.

6 выйдет, будем изучать, ибо jit.

zort
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.