[solved] Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

[solved] Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Mały 1 »

Witam!

Proszę o pomoc w takiej sprawie.

W danym folderze mam plik (film) o nazwie CD-1.avi.

Plik ten został utworzony za pomocą polecenia:

Kod: Zaznacz cały

mencoder -ovc copy -oac copy -endpos 300mb -o $(echo "CD-1.avi") *.wmv
Chciałbym uzyskać taki efekt, aby w kolejnych etapach działania powyższego polecenia nowe pliki otrzymywały nazwę zgodną z kolejnością ich tworzenia tz.: "CD-2.avi", "CD-3.avi", "CD-4.avi"... .

Dziękuje za wskazówki.
Ostatnio zmieniony 03 sty 2012, 22:06 przez Mały 1, łącznie zmieniany 1 raz.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: ethanak »

Wskazówki: sort, head, cut. Ewentualnie zamiast tego może być awk - coś w stylu:

Kod: Zaznacz cały

numer=`ls CD-* | awk -F. 'BEGIN {m=0}; /-[0-9]/ {n=int(substr($1,4));if (n>m) m=n} END {print m+1}'`
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Mały 1 »

Ethanak, bardzo dziękuje za powyższy przykład z awk, który sprawdza się bardzo dobrze ponieważ drukuje na ekranie kolejny numer (w takiej formie numer=4).

Jednak mam problem w jaki sposób wydrukować na ekranie tylko sam numer.

Oto przykłady użycia awk w różnej formie:

1.

Kod: Zaznacz cały

$"numer=`ls CD-* | awk -F. 'BEGIN {m=0}; /-[0-9]/ {n=int(substr($1,4));if (n>m) m=n} END {print m+1}'`"
numer=4: command not found
2.

Kod: Zaznacz cały

$ echo "numer=`ls CD-* | awk -F. 'BEGIN {m=0}; /-[0-9]/ {n=int(substr($1,4));if (n>m) m=n} END {print m+1}'`"
numer=4
3.

Kod: Zaznacz cały

$ numer=$(`ls CD-* | awk -F. 'BEGIN {m=0}; /-[0-9]/ {n=int(substr($1,4));if (n>m) m=n} END {print m+1}'`)
4: command not found
Jak z powyższego przykładu wydrukować na ekranie tylko cyfrę '4' ?
Yakub
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 29 lip 2006, 20:05
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Yakub »

Może lepiej będzie to zrobić skryptem podobnym do tego:

Kod: Zaznacz cały

#!/bin/bash
nazwa=`ls CD-* | sort | tail -1`
nazwa=${nazwa%.*}
nazwa=${nazwa:3}
nazwa=CD-$(($nazwa+1)).avi
touch $nazwa
Jeżeli dobrze myślę, to zamiast touch będzie to Twoje polecenie mencoder
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: ethanak »

Yakub pisze: Jeżeli dobrze myślę
myslisz, ze numery plikow zawsze beda jednocyfrowe?
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Mały 1 »

Yakub pisze:Jeżeli dobrze myślę, to zamiast touch będzie to Twoje polecenie mencoder
W tej postaci skrypt nie działa.

Kod: Zaznacz cały

#!/bin/bash
nazwa=`ls CD-* | sort | tail -1`
nazwa=${nazwa%.*}
nazwa=${nazwa:3}
nazwa=CD-$(($nazwa+1)).avi
touch $nazwa


Wynik:
temp1: 4: Bad substitution
Skrypt powinien być uniwersalny, a więc numery nie mogą być jednocyfrowe.

Podoba mi się rozwiązanie, które podał ethanak, jednak na razie nie wpadłem na pomysł jak wydrukować tylko cyfrę '4'.
Yakub
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 29 lip 2006, 20:05
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Yakub »

Ojj przepraszam, nie sprawdziłem tego dla większych numerów :D

Kod: Zaznacz cały

#!/bin/bash
zm=0
for file in `ls CD-*`; do
numer=${file%.*}
numer=${numer:3}
if [ $zm -lt $numer ]
then
zm=$numer
fi
done
touch CD-$(($zm+1)).avi
Ten już powinien działać
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Mały 1 »

Yakub pisze:Ten już powinien działać
Próbuje Twojego sposobu, ale wychodzą różne błędy. Możesz dokładnie napisać, w które miejsce skryptu mam wstawić poniższe polecenie?

Kod: Zaznacz cały

 mencoder -ovc copy -oac copy -endpos 300mb -o CD-1.avi *.wmv 
Yakub
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 29 lip 2006, 20:05
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Yakub »

Kod: Zaznacz cały

#!/bin/bash
zm=0
for file in `ls CD-*`; do
numer=${file%.*}
numer=${numer:3}
if [ $zm -lt $numer ]
then
zm=$numer
fi
done
mencoder -ovc copy -oac copy -endpos 300mb -o CD-$(($zm+1)).avi *.wmv 
Nie mam jak teraz sprawdzić, ale to powinno być dobrze. Przedtem sprawdzałem działanie skryptu poprzez utworzenie kilku plików o nazwach CD-1.avi, CD-2.avi itp.
Po odpaleniu skryptu, sprawdza on który plik CD-* ma największy numer, po czym zwiększa ten numer o jeden i tworzy nowy plik.
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Mały 1 »

Nie działa. Odpalam go w katalogu, w którym jest jeden film CD-1.avi i dostaje taki błąd:

Kod: Zaznacz cały

$ sh nowy 
nowy: 10: Bad substitution
Yakub
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 29 lip 2006, 20:05
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Yakub »

Spróbuj uruchomić tak:

Kod: Zaznacz cały

./skrypt
zamiast

Kod: Zaznacz cały

sh skrypt
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Mały 1 »

Po tym jak go uruchomiłem w taki sposób:

Kod: Zaznacz cały

 ./skrypt 
to działa poprawnie.

W związku z tym mam pytanie. Dlaczego skrypt wyrzucał błąd jak go chciałem odpalić w taki sposób?

Kod: Zaznacz cały

 sh nazwa_skryptu
Yakub
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 29 lip 2006, 20:05
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Yakub »

Ponieważ u góry w skrypcie jest ścieżka do powłoki bash, a nie do sh. Ewentualnie mozesz odpalic przez

Kod: Zaznacz cały

bash nazwa_skryptu
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Mały 1 »

Muszę doczytać dlaczego polecenie

Kod: Zaznacz cały

sh nazwa_skryptu 
nie chciało jego odpalić.

Na próbę zrobiłem taki skrypt:

Kod: Zaznacz cały

#!/bin/bash

mkdir katalog 
który uruchamiam przez

Kod: Zaznacz cały

sh tworzy_katalog
i działa ok.

EDIT:

W celu dydaktycznym mam jeszcze pytanie. Jak wyświetlić na ekranie z tego polecenia:

Kod: Zaznacz cały

$(zm=0; for file in `ls CD-*`; do numer=${file%.*} numer=${numer:3}; if [ $zm -lt $numer ]; then zm=$numer; fi; done; CD-$(($zm+1)).avi)
tylko nazwę nowego pliku, czyli w tym przypadku CD-5542.avi.?

Poniżej widać, że nazwa wyświetla się łącznie z informacją ': command not found'

Kod: Zaznacz cały

$(zm=0; for file in `ls CD-*`; do numer=${file%.*} numer=${numer:3}; if [ $zm -lt $numer ]; then zm=$numer; fi; done; CD-$(($zm+1)).avi)
CD-5542.avi: command not found
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: ethanak »

Bo chcesz wykonać to co stworzyłeś czyli CD-<numerek>.avi zamiast użyć go jako parametru.

Kod: Zaznacz cały

nazwa=$(zm=0; for file in `ls CD-*`; do numer=${file%.*} numer=${numer:3}; if [ $zm -lt $numer ]; then zm=$numer; fi; done; echo CD-$(($zm+1)).avi)

echo $nazwa
Yakub
Piegowaty Guziec
Piegowaty Guziec
Posty: 12
Rejestracja: 29 lip 2006, 20:05
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Yakub »

Wszystko co wpiszesz w konsoli powłoka potraktuje jak nazwę polecenia. Wpisz samo CD-5542.avi , a też dostaniesz command not found. Dlatego jeśli chcesz wypisać tylko tą nazwę musisz zrobić to sposobem jaki podał ethanak.
Ewentualnie w jednej linijce:

Kod: Zaznacz cały

echo $(zm=0; for file in `ls CD-*`; do numer=${file%.*} numer=${numer:3}; if [ $zm -lt $numer ]; then zm=$numer; fi; done; echo CD-$(($zm+1)).avi)
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Mały 1 »

Koledzy, na wstępie dziękuje za pomoc, ale mam jeszcze problem z rozbudowaniem poniższego polecenia, które chciałbym umieścić w pętli.

Kod: Zaznacz cały

#!/bin/bash
zm=0
for file in `ls CD-*`; do
numer=${file%.*}
numer=${numer:3}
if [ $zm -lt $numer ]
then
zm=$numer
fi
done
mencoder -ovc copy -oac copy -endpos 300mb -o CD-$(($zm+1)).avi *.wmv
Pętla będzie rozpoczynała swoje działanie dopiero po sprawdzeniu i porównaniu dwóch wartości czasu – zapisanego w takim formacie 00:05:40.

Przykład:

A=(00:05:40) – czas trwania filmu, który będzie dzielony
B=(00:02:40) – łączny czas podzielonych już części

Pętla musi rozpoczynać swoje działanie jeżeli A>B, a kończyć kiedy A=B .

Jeżeli będą wymagane dodatkowe informacje to proszę pytać.

Bardzo proszę o pomoc.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: ethanak »

To ja mam pytanie (całkiem poważnie) - Ty chcesz to napisać czy chcesz żeby ktoś Ci napisał? Bo w sumie druga możliwość też jest w pewnym sensie edukacyjna... a taki skrypcik paru osobom pewnie by się przydał... zdecyduj się.
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Mały 1 »

To ja poważnie odpowiem. Na początku chciałem, aby mi ktoś taki skrypt napisał. W tym celu wcześniej założyłem nawet temat viewtopic.php?f=170&t=154093 --> "Bash – podział filmu na części uwzględniający ich wielość i czas rozpoczęcia". Jak widzisz w tamtym temacie nikt nie odpowiedział na moją prośbę. Dlatego między innymi w tym temacie pytam o poszczególne etapy tworzenia skryptu. Jeżeli uważasz, że
ethanak pisze:a taki skrypcik paru osobom pewnie by się przydał...
to chyba dobrze, że powstał taki temat, bo przecież informacje w nim zawarte będą dostępne dla wszystkich.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: ethanak »

No to przeanalizuj sobie działanie takiego skrypciku:

Kod: Zaznacz cały

#!/bin/bash
totlen=0
name="$1"
size="300mb"
orglen=`mplayer -identify -nosound -vo null -frames 0 "$name" 2>/dev/null | awk -F= '/ID_LEN/ {print int($2)}'`
echo "Czas trwania: $orglen"
n=0
while let "$totlen<$orglen-2"; do
	let "n=$n+1"
	mencoder -oac copy -ovc copy -endpos $size -ss $totlen -o CD-$n.avi "$name" >/dev/null
	sleng=`mplayer -identify -nosound -vo null -frames 0 CD-$n.avi 2>/dev/null | awk -F= '/ID_LEN/ {print int($2)}'`
	echo "Czas trwania fragmentu: $sleng"
	let "totlen=$totlen+$sleng"
	echo "Czas całkowity: $totlen"
done
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości