[Rozw.] bash zamiana znaków tr
Moderatorzy: Moderatorzy, Administratorzy
[Rozw.] bash zamiana znaków tr
Witam mam mały problem, mam dużą ilość plików w moim Slackware które pochodzą z Windowsa i niestety w nazwach zepsuło mi się kodowanie, więc postanowiłem napisać mały skrypt który zmieni mi wszystkie nazwy plików.
Przykładowa nazwa pliku to:
`Ĺ\233liwka i chce zamienić tę nazwę na śliwka
niestety to polecenie nie działa:
tr -s 'Ĺ\\233' 'ś'
Może ktoś mi doradzi co jest źle.
Przykładowa nazwa pliku to:
`Ĺ\233liwka i chce zamienić tę nazwę na śliwka
niestety to polecenie nie działa:
tr -s 'Ĺ\\233' 'ś'
Może ktoś mi doradzi co jest źle.
Ostatnio zmieniony 2013-10-04, 11:25 przez Miko, łącznie zmieniany 2 razy.
Re: bash zamiana znaków tr
tr chyba sobie z tym nie poradzi (on raczej zajmuje się zamianą znaków, a nie ciągów znaków).
Może użyj seda.
Na początek zwykły ls w katalogu, w którym znajduje się ten plik, żeby sprawdzić jak zadziała:
Składnia tego, co występuje za opcją -e wygląda tak:
s/ciąg_do_zastąpienia/ciąg_zastępujący/
oczywiście trzeba postawić dodatkowy backslash przy backslashu, aby bash potraktował go jako zwykły znak;
opcja g na końcu oznacza zastąpienie wszystkich ciągów, a nie tylko pierwszego napotkanego.
Może użyj seda.
Na początek zwykły ls w katalogu, w którym znajduje się ten plik, żeby sprawdzić jak zadziała:
Kod: Zaznacz cały
ls | sed -e 's/`Ĺ\\233/ś/g'
s/ciąg_do_zastąpienia/ciąg_zastępujący/
oczywiście trzeba postawić dodatkowy backslash przy backslashu, aby bash potraktował go jako zwykły znak;
opcja g na końcu oznacza zastąpienie wszystkich ciągów, a nie tylko pierwszego napotkanego.
Re: bash zamiana znaków tr
-e nie jest potrzebne. W bash śliwka będzie wyświetlana z podwójnym '\' tak więc potrzebne będzie '\\\\' przed 233 przy ls
Kod: Zaznacz cały
ls |grep 'Ĺ\\\\233'|while read FILE;do FNAME=$(echo "${FILE}"| sed 's/`Ĺ\\233/ś/g');mv "${FILE}" "${FNAME}" ;done
Re: bash zamiana znaków tr
Poszedłem za Twoją radą i napisałem taki mały skrypt który niestety nie działa...
I niestety nie mogę sobie poradzić...
Kod: Zaznacz cały
for plik in * ;do
mv "$plik" "`echo $plik|sed -e 's/Ĺ\\233/ś/g'`"
done
I niestety nie mogę sobie poradzić...
Re: bash zamiana znaków tr
Miko, przecież podałem Tobie gotowy skrypt...
n/c
n/c
Re: bash zamiana znaków tr
Tylko że niestety Twój skrypt nie zmienił mi żadnej nazwy
Re: bash zamiana znaków tr
Jak no moje to to będzie coś w stylu:
Przynajmniej na Slackware. Inne dystribucje mogą mięć inne rename i wówczas:
Oczywiście wymaga odpalenia w bashu (z uwagi na $'').
PS. webster “ls | … | while …” jest prawie zawsze niepoprawnym rozwiązaniem. for, tak jak próbował Miko, jest znacznie lepsze.
Kod: Zaznacz cały
rename $'Ĺ\233' ś *
Kod: Zaznacz cały
rename $'s/Ĺ\233/ś/' *
PS. webster “ls | … | while …” jest prawie zawsze niepoprawnym rozwiązaniem. for, tak jak próbował Miko, jest znacznie lepsze.
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.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Re: bash zamiana znaków tr
mina86, zawsze piszę z while i wszystko mi hula subiektywna opinia o tym co jest lepsze. Jedno i drugie bazuje nie na jednej a na większej ilości komend. rename zamyka się w jednym i może być ok. To czy Zrobisz sobie for i while to jest bez różnicy.
Z komendą rename mi nie hulało więc zrobiłem na pętli.
Ps. Po testowałem Twoją linię mina86 i nie hula.
Miko, Daj wynik ls w tym katalogu. Starałem się stworzyć taki plik o którym mowa touch '`Ĺ\233liwka' i komenda ls zwraca mi `Ĺ\\233liwka
Z komendą rename mi nie hulało więc zrobiłem na pętli.
Ps. Po testowałem Twoją linię mina86 i nie hula.
Miko, Daj wynik ls w tym katalogu. Starałem się stworzyć taki plik o którym mowa touch '`Ĺ\233liwka' i komenda ls zwraca mi `Ĺ\\233liwka
Re: bash zamiana znaków tr
U mnie to samo zwraca tylko jeden backslash.webster pisze:Starałem się stworzyć taki plik o którym mowa touch '`Ĺ\233liwka' i komenda ls zwraca mi `Ĺ\\233liwka
Stworzyłem kilka plików w katalogu. Oto lista:
Kod: Zaznacz cały
ls -1
`Ĺ\233liwka
ko`Ĺ\233ciotrup `Ĺ\233wistaka
królewna `Ĺ\233nieżka
Wpisałem wszystkie komendy, które zostały podane w tym wątku i tylko moja poprawnie zamieniła (tj. tylko wyświetliła) nazwy tych plików.
webster, masz rację, że -e jest niepotrzebne, w końcu nie podajemy wielu ciągów do zamiany, tylko jeden.
I teraz:
Kod: Zaznacz cały
ls | sed 's/`Ĺ\\233/ś/g'
śliwka
kościotrup świstaka
królewna śnieżka
Kod: Zaznacz cały
for STARA in * ; do
NOWA=`ls "$STARA" | sed 's/`Ĺ\\233/ś/g'`
mv "$STARA" "$NOWA"
done
Wiecie, jak rozwiązać ten problem?
edycja:
Ok, poczytałem i udało mi się obejść problem. Zamiast tych grawisów (chyba to jest poprawna nazwa tych apostrofów; ang. backtick) użyłem $(). Czyli:
Kod: Zaznacz cały
#/bin/bash
# zamiana.sh
# zamienia starą nazwę pliku zawierającą ciąg `Ĺ\233 na nową, zastępując go literą ś
for STARA in * ; do
NOWA=$(ls "$STARA" | sed 's/`Ĺ\\233/ś/g')
mv "$STARA" "$NOWA"
done
Oto lista:
Kod: Zaznacz cały
ls -1
kościotrup świstaka
królewna śnieżka
zamiana.sh
śliwka
Ostatnio zmieniony 2013-09-27, 17:05 przez elesmod, łącznie zmieniany 1 raz.
Re: bash zamiana znaków tr
a Daj tak
Kod: Zaznacz cały
NOWA=$(ls "${STARA}" | sed 's/`Ĺ\\233/ś/g')
echo "${STARA}" "${NOWA}"
mv "${STARA}" "${NOWA}"
Re: bash zamiana znaków tr
Aj... A ja zacząłem edycję mojego posta przed tym, gdy Ty wrzuciłeś swój. Wykorzystałem tę samą sztuczkę
Sprawdziłem, obie wersje działają (przynajmniej u mnie).
Sprawdziłem, obie wersje działają (przynajmniej u mnie).
Re: bash zamiana znaków tr
No to się cieszkam )
Daj w temacie [Rozw.] i lecimy dalej
Pozdr.
Daj w temacie [Rozw.] i lecimy dalej
Pozdr.
Re: bash zamiana znaków tr
Poczekaj, daj szansę Mikowi sprawdzić, czy na jego oryginalnych plikach też będzie działaćwebster pisze:Daj w temacie [Rozw.] i lecimy dalej
Re: bash zamiana znaków tr
eee tam
Re: bash zamiana znaków tr
Dzięki wielkie za pomoc, tylko mam jeszcze jedno pytanko dlaczego wyskakuje mi taki komunikat i nie zmienia nazwy ?
Polecenie ls
skrypt
Po uruchomieniu skryptu wyskakuje mi następujący komunikat:
Polecenie ls
Kod: Zaznacz cały
zdjecie.szymuĹ\233.JPG*
Kod: Zaznacz cały
#!/bin/bash
NOWA=$(ls "${STARA}" | sed 's/Ĺ\\233/ś/g')
echo "${STARA}" "${NOWA}"
mv "${STARA}" "${NOWA}"
Kod: Zaznacz cały
ls: nie ma dostępu do : Nie ma takiego pliku ani katalogu
mv: nie można wykonać stat na `': Nie ma takiego pliku ani katalogu