[Rozw.] bash zamiana znaków tr

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

Awatar użytkownika
mina86
Moderator
Posty: 3314
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 4.x x86_64
Kontakt:

Re: bash zamiana znaków tr

Post autor: mina86 » 2013-09-30, 14:11

webster pisze:mina86, zawsze piszę z while i wszystko mi hula :) subiektywna opinia o tym co jest lepsze.
Nieprawda. ls | while read file; do …; done jest obiektywnie niepoprawne, gdyż źle interpretuje znaki przejścia do nowej linii w nazwach plików.
webster pisze:To czy Zrobisz sobie for i while to jest bez różnicy.
Jest różnica.
webster pisze:Ps. Po testowałem Twoją linię mina86 i nie hula.
Dlatego napisałem “coś w stylu”, bo może być, że pierwszy argument musi być jakoś inaczej zakodowany. Niemniej raneme powinno działać jeżeli się je dobrze odpali. Proponuję uzupełnić tabem do jednego z plików z problematyczną sekwencją znaków po czym wywalić prefiks.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną. :: Post generated automatically by A.I. system called “mina86” in response to the previous one. :: Tiny Applications

Awatar użytkownika
webster
Użytkownik
Posty: 1266
Rejestracja: 2009-10-06, 11:58
Lokalizacja: Gdańsk
Kontakt:

Re: bash zamiana znaków tr

Post autor: webster » 2013-09-30, 17:48

mina86 pisze:[...]źle interpretuje znaki przejścia do nowej linii w nazwach plików.[...]
Ke ?
††† Chaos Of The Mirror - Valheru †††
††† I ♥ SlackWare RuLeZ †††

Slackware Poland FaceBook

Awatar użytkownika
mina86
Moderator
Posty: 3314
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 4.x x86_64
Kontakt:

Re: bash zamiana znaków tr

Post autor: mina86 » 2013-09-30, 21:10

Kod: Zaznacz cały

$ mkdir /tmp/foo && cd /tmp/foo && touch $'a\nb' && ls | while read file; do echo "file: $file"; done
file: a
file: b
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną. :: Post generated automatically by A.I. system called “mina86” in response to the previous one. :: Tiny Applications

Awatar użytkownika
elesmod
Użytkownik
Posty: 47
Rejestracja: 2012-08-30, 13:00

Re: bash zamiana znaków tr

Post autor: elesmod » 2013-09-30, 23:59

Miko pisze:dlaczego wyskakuje mi taki komunikat i nie zmienia nazwy?

Kod: Zaznacz cały

#!/bin/bash
                NOWA=$(ls "${STARA}" | sed 's/Ĺ\\233/ś/g')
                 echo "${STARA}" "${NOWA}"
                 mv "${STARA}" "${NOWA}"
Dzieje się tak dlatego, że próbujesz zrobić ls na zmiennej $STARA, ale bash nie wie o co chodzi, bo jej nie zdefiniowałeś.

Wyżej webster nie napisał całego skryptu, tylko ten kawałek, który się różnił od mojego. Musisz dodać tę pętlę for, czyli cały skrypt wyglądałby tak:

Kod: Zaznacz cały

#!/bin/bash

for STARA in * ; do
      NOWA=$(ls "${STARA}" | sed 's/Ĺ\\233/ś/g')
      echo "${STARA}" "${NOWA}"
      mv "${STARA}" "${NOWA}"
done
Jeśli masz zamiar uruchomić ten skrypt w katalogu, gdzie jest dużo plików, w których nie występuje Ĺ\\233, to proponuję zmienić linię z for na:

Kod: Zaznacz cały

for STARA in *233* ; do
żeby nie zasypało Ci terminala wiadomościami typu "mv: abc i abc to ten sam plik"

Miko
Użytkownik
Posty: 13
Rejestracja: 2012-04-03, 09:05

Re: bash zamiana znaków tr

Post autor: Miko » 2013-10-01, 08:58

Niestety nie udało mi się tego uruchomić

Kod: Zaznacz cały

#!/bin/bash
        for STARA in * ; do
                NOWA=$(ls "${STARA}" | sed 's/Ĺ\\233/ś/g')
                echo "${STARA}" "${NOWA}"
                mv "${STARA}" "${NOWA}"
        done
I oprócz tego że wypluwa mi pliki które nie maja Ĺ\\233 w nazwie to kiedy natrafia na właściwy plik to mam komunikat taki jak zmienna $NOWA i $STARA były takie same.

Kod: Zaznacz cały

mv: `SzymuĹ\233.JPG' i `SzymuĹ\233.JPG' to ten sam plik

Awatar użytkownika
webster
Użytkownik
Posty: 1266
Rejestracja: 2009-10-06, 11:58
Lokalizacja: Gdańsk
Kontakt:

Re: bash zamiana znaków tr

Post autor: webster » 2013-10-01, 09:12

Miko, Weź mi wyślij przykładowy plik na maila webst3r@gmail.com, gdybym miał takie środowisko jak Ty to bym to ugryzł, nie mam takich haszy, może się uda. Wyślij ten plik
††† Chaos Of The Mirror - Valheru †††
††† I ♥ SlackWare RuLeZ †††

Slackware Poland FaceBook

Awatar użytkownika
webster
Użytkownik
Posty: 1266
Rejestracja: 2009-10-06, 11:58
Lokalizacja: Gdańsk
Kontakt:

Re: bash zamiana znaków tr

Post autor: webster » 2013-10-02, 11:30

Pokombinowałem na wiele sposobów i convert'em itd, jednak niezależnie wracam do sposobu mina86 który jedynie nie widział prawidłowo wyświetlanego hashu w bash do napisania poprawnej składni.

Tak więc w myśl kolegi mina86 można sobie pomóc skrypcikiem

Kod: Zaznacz cały

#!/bin/sh
cd "$(pwd)" # Edit - Uwaga od mina86. Dodano cudzysłowie.

# Podajesz kolejne jakie tam znajdziesz

rename $'Ĺ\302\233' ś *
rename $'Ä\302\231' ę *
Zawartość zapisz do pliku, Daj chmod +x nazwa_pliku i wykonaj go w katalogu z plikami do zmiany. Lub po prostu wykonaj te linie.

Na podstawie przesłanego pliku rozpoznałem dwie literki ś oraz ę. Analogicznie wykonaj kolejne linie.

Pozdr.
Ostatnio zmieniony 2013-10-02, 13:08 przez webster, łącznie zmieniany 1 raz.
††† Chaos Of The Mirror - Valheru †††
††† I ♥ SlackWare RuLeZ †††

Slackware Poland FaceBook

Awatar użytkownika
mina86
Moderator
Posty: 3314
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 4.x x86_64
Kontakt:

Re: bash zamiana znaków tr

Post autor: mina86 » 2013-10-02, 12:56

webster pisze:

Kod: Zaznacz cały

cd $(pwd)
Ke? Raz, że brak cudzysłowów, dwa, że po co?
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną. :: Post generated automatically by A.I. system called “mina86” in response to the previous one. :: Tiny Applications

Awatar użytkownika
webster
Użytkownik
Posty: 1266
Rejestracja: 2009-10-06, 11:58
Lokalizacja: Gdańsk
Kontakt:

Re: bash zamiana znaków tr

Post autor: webster » 2013-10-02, 13:01

Po to że wrzuciłem to do /usr/bin u siebie i wkleiłem zawartość. Skrypt może mi się kiedyś przyda.
Fakt cudzysłów by się przydał.

Pozdr.
††† Chaos Of The Mirror - Valheru †††
††† I ♥ SlackWare RuLeZ †††

Slackware Poland FaceBook

ODPOWIEDZ