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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1




złodziej wirków ]:->
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
#!/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"
donePrzepuszczenie nazw plików przez tr '' '_' przed zmianą nazw to ostateczność.
Offline



Redaktor




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




Użyszkodnik
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




złodziej wirków ]:->
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:
#!/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"
donetylko 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 ;]
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)
Offline





Bicycle repairman






A może:
#!/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
doneParament -n należy usunąć aby zmienić nazwy.
Offline




złodziej wirków ]:->
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:
#!/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"
doneCudzysłowy i "masochistyczna" wersja pętli no i zmiana dwukropka na pauzę.
Offline
Strony: 1