Strona 1 z 1

[bash] Pobieranie nazwy pliku

: 22 mar 2010, 21:26
autor: Slesz
Może to i proste, ale mocuję się z tym od jakiegoś czasu. Piszę skrypt, a właściwie walę wszystko do jednego aliasa. Co skrypt ma robić?

rozpakowywać archiwum (7zip lub rar),
wykonywać program unecm na plikach z rozszerzeniem *.ecm,
kasować rozpakowane archiwum i plik *.ecm
pakować rozpakowane pliki 7zipem (o możliwych rozszerzeniach *.ccd *.img *.sub *.bin *.cue *.iso *.mds *.mdf) nadając nazwę pierwszego pliku, który będzie wrzucany do archiwum
pakować te same pliki rarem (te same możliwe rozszerzenia) z tą samą nazwą, co wyżej
kasować pliki o wyżej wymienionych rozszerzeniach (pozostrawiać stworzone archiwa)
porównać wielkości plików i przenieść mniejszy do danego folderu

Problem mam z pobraniem nazwy jednego z plików (dowolnego, bo wszystkie będą miały tę samą nazwę za wyjątkiem rozszerzenia) i nazwaniem tak archiwum, a także z rozpoznawaniem wielkości plików i przenoszenia tego najmniejszego.
Jestem względnie ciemny w tych sprawach, do tej pory robiłem to ręcznie i dawałem radę, ale o wiele łatwiej by mi było zautomatyzować te czynności i mieć pod jedną komendą.

Odp: [bash] Pobieranie nazwy pliku

: 22 mar 2010, 21:45
autor: beluosus
Jeden z plików, więc najłatwiej chyba wybrać pierwszy, który się napatoczy. ;)

Kod: Zaznacz cały

ls | head -1
Pobieranie nazwy bez rozszerzenia:

Kod: Zaznacz cały

fn=$(basename /home/beluosus/test.cpp); fn=${fn%.*} ; echo $fn
Nazwa najmniejszego pliku z katalogu:

Kod: Zaznacz cały

ls -lS | tail -1 | sed 's/.*[0-9]\{2\}:[0-9]\{2\} //'

Odp: [bash] Pobieranie nazwy pliku

: 23 mar 2010, 01:00
autor: Slesz
Dziękuję, już trochę lepiej idzie, ale jako newbie nadal nie wszystko tak łatwo mi przychodzi.

Kod: Zaznacz cały

fn=$(basename [ściecha]/*.*)
7zip a [opcje] $fn.7z *.ccd *.img *.sub
z tym, że nazwa miewa spacje (różne pliki, różne ilości spacji), czyli skrypt powinien brać nazwę prawidłowo albo wstawiać backslash przed spacjami i nawiasami, żeby wstawiało pełną nazwę albo prawidłowo ją wczytywać...
Poza tym, wstyd się przyznać, ale opcje z ls jedynie wyświetlają mi nazwę, chciałbym wczytać je do zmiennej tak, abym mógł dać coś w rodzaju

Kod: Zaznacz cały

7z a [opcje] $nazwa_dowolnego_pliku_archiwizowanego *.[rozszerzenia]
rar a [opcje] $nazwa_dowolnego_pliku_archiwizowanego *.[rozszerzenia]
mv $nazwa_pliku_mniejszego [folder docelowy]
rm *
W ten sposób mógłbym spakować pliki obrazu płyty na dwa sposoby z tą samą, domyślną nazwą, przenieść mniejszy (a z tym w przypadku 7zipa i rara różnie bywa, choć generalnie 7zip częściej bywa lepszy) w bezpieczne miejsce i skasować niepotrzebne śmieci.

EDit: Słowem - jak pobrać znalezioną nazwę do zmiennej. Read tylko pyta użytkownika o podanie.

Odp: [bash] Pobieranie nazwy pliku

: 23 mar 2010, 11:30
autor: beluosus
Przeanalizuj kod, który dałem. To wydrukuje nazwę pierwszego pliku w katalogu:

Kod: Zaznacz cały

fn=$(basename "$(ls | head -1)"); fn=${fn%.*} ; echo $fn
Cudzysłów sprawia, że plik może posiadać spacje w nazwie.

Odp: [bash] Pobieranie nazwy pliku

: 23 mar 2010, 23:32
autor: Slesz
Ugh, wklepywałem bez cudzysłowu. Dziękuję.