[Rozw.] bash zamiana znaków tr

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

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

Re: bash zamiana znaków tr

Post autor: mina86 »

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 code name ‘mina86’ in response to the previous one.
Awatar użytkownika
webster
Użytkownik
Posty: 1269
Rejestracja: 2009-10-06, 11:58
Lokalizacja: Gdańsk
Kontakt:

Re: bash zamiana znaków tr

Post autor: webster »

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: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: bash zamiana znaków tr

Post autor: mina86 »

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 code name ‘mina86’ in response to the previous one.
Awatar użytkownika
elesmod
Użytkownik
Posty: 47
Rejestracja: 2012-08-30, 13:00

Re: bash zamiana znaków tr

Post autor: elesmod »

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 »

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: 1269
Rejestracja: 2009-10-06, 11:58
Lokalizacja: Gdańsk
Kontakt:

Re: bash zamiana znaków tr

Post autor: webster »

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: 1269
Rejestracja: 2009-10-06, 11:58
Lokalizacja: Gdańsk
Kontakt:

Re: bash zamiana znaków tr

Post autor: webster »

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: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: bash zamiana znaków tr

Post autor: mina86 »

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 code name ‘mina86’ in response to the previous one.
Awatar użytkownika
webster
Użytkownik
Posty: 1269
Rejestracja: 2009-10-06, 11:58
Lokalizacja: Gdańsk
Kontakt:

Re: bash zamiana znaków tr

Post autor: webster »

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