Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2008-12-19 03:33:55

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

[bash] Operacje na plikach - zmiana seryjna zmiana nazwy

Zostałem poproszony o skrypt, który zmieniałby nazwy wielu plików.Tylko zmiana ma być specyficzna. Z name.ext ma zrobić name(DataModyfikacji_GodzinaModyfikacji).ext, gdzie ext to rozszerzenie pliku. Poszperałem trochę po google, pomęczyłem trochę innych ale nie mogę sobie poradzić z jedną rzeczą. Skrypt się krzaczy w momencie jak w nazwie pliku występuje spacja:/:( Speców od bash'a proszę o pomoc

Kod:

#!/bin/bash

FILES=`ls $1`
for file in $FILES
do
 NAME=${file%.*}
 EXT=${file##*.}
 DATE="$(stat "$1/$file" | sed -n 's/^.*Modify: *\([^ ]*\) .*$/\1/p')" 
 TIME=`ls -l $1/$file |awk '{print $8}' |tr ':' '_'`
 NEWNAME=$NAME"("$DATE"_"$TIME")."$EXT
 mv "$1/$file" "$1/$NEWNAME"
done

Przepuszczenie nazw plików przez tr '' '_' przed zmianą nazw to ostateczność.


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

#2  2008-12-19 04:28:19

  fnmirk - Redaktor

fnmirk
Redaktor
Zarejestrowany: 2008-02-19

Re: [bash] Operacje na plikach - zmiana seryjna zmiana nazwy

Nie znam się zbytnio na skryptologi ale ostatnio wrzuciłem na forum taki odnośnik do skryptów. Poszperaj w tych skryptach może coś zmienisz, że Twój zadziała.

Offline

 

#3  2008-12-19 13:06:00

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [bash] Operacje na plikach - zmiana seryjna zmiana nazwy

Niedawno Ci pokazywałem jak zrobić taką pętelkę...

Deklarując NEWNAME cudzysłowami oznaczasz złe fragmenty — powinieneś zmienne a nie nie-zmienne. To nie perl :) .

Offline

 

#4  2008-12-19 13:24:36

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

Re: [bash] Operacje na plikach - zmiana seryjna zmiana nazwy

Minio wiem i nawet patrzyłem na ten temat :D tylko nie wiem czy w dobre miejsca wrzucam te  cudzysłowy ;] zaraz powalczę dalej w końcu dojdę co i jak.

No dobra edytowałem dziada, podokładałem cudzysłowy i prawie działa:

Kod:

#!/bin/bash

FILES=`ls $1`
ls $1 | while read file 
do
 NAME="${file%.*}"
 EXT="${file##*.}"
 DATE="$(stat "$1/$file" | sed -n 's/^.*Modify: *\([^ ]*\) .*$/\1/p')" 
 HOUR="`ls -l $1/$file |awk '{print $8}' |cut -d":" -f1`"
 MIN="`ls -l $1/$file |awk '{print $8}' |cut -d":" -f2`"
 NEWNAME="$NAME"_"$DATE"_"$HOUR"-"$MIN"."$EXT"
 mv "$1/$file" "$1/$NEWNAME"
done

tylko dalej spacje mu się nie podobają ;] Wysypuje się przy stat więc przypuszczam ze jeszcze gdzieś tam ma być cudzysłów ale niewiem dokładnie gdzie ;]

Teraz opis jak to działa ;]
mam katalog /test z pełnymi prawami dostępu w katalogu znajdują się takie pliki: "ble.ble.ble.avi" "test ble.avi" "test.avi"
odpalam skrypt: sh ren.sh /test
i w wyniku mam nowe nazwy w takiej postaci:
ble.ble.ble_data_godzina.avi
test_data_godzina.avi
test ble_data_-.avi

w pliku ze spacją w nazwie nie dokleja godziny to raz, dwa przy okazji dostaję na konsoli trochę błędów ;]

Kod:

ls: nie ma dostępu do te//test: Nie ma takiego pliku ani katalogu
ls: nie ma dostępu do ble.avi: Nie ma takiego pliku ani katalogu
ls: nie ma dostępu do te//test: Nie ma takiego pliku ani katalogu
ls: nie ma dostępu do ble.avi: Nie ma takiego pliku ani katalogu

Ostatnio edytowany przez winnetou (2008-12-19 14:06:10)


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

#5  2008-12-19 14:25:35

  czadman - Bicycle repairman

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: [bash] Operacje na plikach - zmiana seryjna zmiana nazwy

A może:

Kod:

#!/bin/bash

FILES=`ls $1`
for file in $FILES
do
    DATE=`date -r $1/${file} +%Y-%m-%d_%H:%M:%S`
    /usr/bin/rename -n 's/(.*)(\..*$)/$1-'${DATE}'$2/' $1/$file
done

Parament -n należy usunąć aby zmienić nazwy.


http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

#6  2008-12-19 14:36:19

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

Re: [bash] Operacje na plikach - zmiana seryjna zmiana nazwy

Dzięki czadman działa idealnie musiałem tylko wprowadzić drobne modyfikacje bo w Twojej wersji też się sypał na nazwach ze spacjami ;]

gotowa i (chyba) poprawna wersja powinna wyglądać tak:

Kod:

#!/bin/bash

ls $1 |while read file
do
    DATE=`date -r "$1/${file}" +%Y-%m-%d_%H-%M`
    /usr/bin/rename -n 's/(.*)(\..*$)/$1-'${DATE}'$2/' "$1/$file"
done

Cudzysłowy i "masochistyczna" wersja pętli no i zmiana dwukropka na pauzę.


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)