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
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" done
Przepuszczenie nazw plików przez tr '' '_' przed zmianą nazw to ostateczność.
Offline
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
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
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" 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 ;]
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
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 done
Parament -n należy usunąć aby zmienić nazwy.
Offline
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" done
Cudzysłowy i "masochistyczna" wersja pętli no i zmiana dwukropka na pauzę.
Offline
Strony: 1