1

Temat: SKrypt zmieniający nazwy plików

Witam,

Potrzebuję napisać skrypt, który zamieni wszystkie polskie litery na nie-polskie (tzn. Ł-->L  Ą-->A  Ń-->N itp) oraz spacje zastąpi podkreśleniem "_".

Potrzebuję zmieni kilkadziesiąt tys. plików (zdjęć), bez tego webowa galeria nie chce ich przyjąć.

Pętlę for mogę zrobić na jednym katalogu, ale chciałbym zapuścić skrypt na główmy katalogu i aby "zszedł" do końca i pomieniał nazwy plików.
Wyobrażam sobie, że odczytuje nazwę pliku do zmiennej, obrabiam string (jeszcze nie wiem jakim polecniem) oraz zmieniam nazwę pliku na nowy.


Nazwy katalogów zakładam niezmienne.

Pozdrawiam, Krzysiek

2

Odp: SKrypt zmieniający nazwy plików

A ten skrypt to w jakim języku i na jaki system?

3

Odp: SKrypt zmieniający nazwy plików

Wykonam go na Debianie, myślę o BASH/SH

4

Odp: SKrypt zmieniający nazwy plików

Przykład:
https://bmwieczorek.wordpress.com/2009/ … haracters/

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5

Odp: SKrypt zmieniający nazwy plików

O super za przykład.

A mogę jeszcze prosić o podpowiedź, jak "chodzić" po katalogach, bo przykład uruchomię na bieżącym katalogu, a w sumie mam około 600 katalogów i wolałbym, aby automat przeszukał drzewo katalogów.

6

Odp: SKrypt zmieniający nazwy plików

find to robi właśnie domyślnie. Możesz w nim ograniczyć liczbę poziomów, ale jak tego nie zrobisz to leci po wszystkich. Pobaw się poleceniami to zobaczysz co się dzieje.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

7 (edytowany przez oneiro 2016-04-25 22:35:36)

Odp: SKrypt zmieniający nazwy plików

Racja, nie dotyczyłem. Ale mam jakiś problem

#!/bin/bash
r=$1
#usuwam spacje
r=$(echo $1 | sed 's/ /_/g')

#usuwam znaki specjalne PL
r=$(echo $1 | sed 's/Ą/A/g' | sed 's/Ć/C/g' | sed 's/Ę/E/g' | sed 's/Ł/L/g' | sed 's/Ń/N/g' | sed 's/Ó/O/g' | sed 's/Ś/S/g' | sed 's/Ź/Z/g' | sed 's/Ż/Z/g' | sed 's/ą/a/g' | sed 's/ć/c/g' | sed 's/ę/e/g' | sed 's/ł/l/g' | sed 's/ń/n/g' | sed 's/ó/o/g' | sed 's/ś/s/g' | sed 's/ź/z/g' | sed 's/ż/z/g')

echo '>>>' "$r" '<<>>' "$1" '|||' "$r" '<<<';

mv "$1" "$r"
exit 0

Na przykładzie jednego katalogu mam:

root@omv:/media/6acff0b7-3a30-4c39-839a-76abecf91c04/backup/wspolny/Zdjęcia/Nasze/2006_Zdjecia_od_Krzysika# find  -exec /zmiana.sh "{}" \;
>>> . <<>> . ||| . <<<
mv: `.' i `./.' to ten sam plik
>>> ./DSCN0995.JPG <<>> ./DSCN0995.JPG ||| ./DSCN0995.JPG <<<
mv: `./DSCN0995.JPG' i `./DSCN0995.JPG' to ten sam plik
>>> ./Krzysiek Oneiro.bmp <<>> ./Krzysiek Oneiro.bmp ||| ./Krzysiek Oneiro.bmp <<<
mv: `./Krzysiek Oneiro.bmp' i `./Krzysiek Oneiro.bmp' to ten sam plik
>>> ./DSCN0983.JPG <<>> ./DSCN0983.JPG ||| ./DSCN0983.JPG <<<
mv: `./DSCN0983.JPG' i `./DSCN0983.JPG' to ten sam plik
>>> ./Thumbs.db <<>> ./Thumbs.db ||| ./Thumbs.db <<<
mv: `./Thumbs.db' i `./Thumbs.db' to ten sam plik
>>> ./Krzys Ilo 1.jpg <<>> ./Krzys Ilo 1.jpg ||| ./Krzys Ilo 1.jpg <<<
mv: `./Krzys Ilo 1.jpg' i `./Krzys Ilo 1.jpg' to ten sam plik
>>> ./DSCN0965.JPG <<>> ./DSCN0965.JPG ||| ./DSCN0965.JPG <<<
mv: `./DSCN0965.JPG' i `./DSCN0965.JPG' to ten sam plik
>>> ./aacc.txt <<>> ./aacc.txt ||| ./aacc.txt <<<
mv: `./aacc.txt' i `./aacc.txt' to ten sam plik

Wydaje się, że znikły polski litery, ale ciągle mam problem ze spacjami.

8 (edytowany przez oneiro 2016-04-26 00:34:22)

Odp: SKrypt zmieniający nazwy plików

DObra, był bąłd w przykładzie poniższe działa

#!/bin/bash
r=$1
#usuwam spacje
r=$(echo $1 | sed 's/ /_/g')

#usuwam znaki specjalne PL
#r=$(echo $r | sed 's/Ą/A/g' | sed 's/Ć/C/g' | sed 's/Ę/E/g' | sed 's/Ł/L/g' | sed 's/Ń/N/g' | sed 's/Ó/O/g' | sed 's/Ś/S/g' | sed 's/Ź/Z/g' | sed 's/Ż/Z/g' | sed 's/ą/a/g' | sed 's/ć/c/g' | sed 's/ę/e/g' | sed 's/ł/l/g' | sed 's/ń/n/g' | sed 's/ó/o/g' | sed 's/ś/s/g' | sed 's/ź/z/g' | sed 's/ż/z/g' |sed 's/@/_at_/g' | sed 's/(/_/g' | sed 's/)/_/g' )

r=$(echo $r | sed -e 's/Ą/A/g; s/Ć/C/g ;s/Ę/E/g ;s/Ł/L/g ;s/Ń/N/g ;s/Ó/O/g; s/Ś/S/g ; s/Ź/Z/g ; s/Ż/Z/g ; s/ą/a/g ; s/ć/c/g ;s/ę/e/g;s/ł/l/g ; s/ń/n/g ;s/ó/o/g ; s/ś/s/g ; s/ź/z/g ; s/ż/z/g ;s/@/_at_/g ; s/(/_/g ; s/)/_/g; s/,/_/g; s/~/_/g; s/%/_/g; s/\[/_/g; s/\]/_/g' )



if [ "$1" != "$r" ]
        then
        if [ ! -f "$r" ]; then
        echo "$1" '<<>>' "$r"
        mv  "$1" "$r"
                else echo "Plik istnieje $r"
                fi
        fi
#echo $r
exit 0