przemianowywanie plików w bashu

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
sir_herrbatka
Zakręcona Traszka
Zakręcona Traszka
Posty: 587
Rejestracja: 10 maja 2009, 14:44
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86

przemianowywanie plików w bashu

Post autor: sir_herrbatka »

cześć,

chciałbym przemianować grupę plików w ten sposób że wykasuję pięć pierwszych znaków z nazwy.

Czy ktoś mógłby polecić jakiś artykuł opisujące podobne "cuda" (fajnie byłoby też masowo przenosić pliki z kilku folderów do jednego). Artykuł może być po angielsku.

:-)
Awatar użytkownika
azhag
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 151
Rejestracja: 24 maja 2010, 19:30
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Fluxbox
Architektura: x86
Kontakt:

Odp: przemianowywanie plików w bashu

Post autor: azhag »

Kod: Zaznacz cały

man rename
+ dowolny tekst opisujący choćby pokrótce wyrażenia regularne
fajnie byłoby też masowo przenosić pliki z kilku folderów do jednego
Po prostu

Kod: Zaznacz cały

find ... -exec mv ...
# lub
mv */pliki .
Polski portal Debiana: http://dug.net.pl/
sir_herrbatka
Zakręcona Traszka
Zakręcona Traszka
Posty: 587
Rejestracja: 10 maja 2009, 14:44
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: przemianowywanie plików w bashu

Post autor: sir_herrbatka »

dziękuję! Przeczytam manuale. Wydaje się to dość proste.

Edit, no dobra jednak nie :/

Kod: Zaznacz cały

$ find -name *.zip -exec unzip
Zwraca mi

Kod: Zaznacz cały

find: brak argumentu dla `-exec'
I mimo różnych kombinacji nie jestem w stanie dojść do tego o co chodzi. :(
Awatar użytkownika
azhag
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 151
Rejestracja: 24 maja 2010, 19:30
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Fluxbox
Architektura: x86
Kontakt:

Odp: przemianowywanie plików w bashu

Post autor: azhag »

sir_herrbatka pisze:

Kod: Zaznacz cały

$ find -name *.zip -exec unzip

Kod: Zaznacz cały

find -name "*.zip" -exec unzip '{}' ';'
gdzie '{}' to nazwa aktualnie przetwarzanego pliku, zaś ';' koniec opcji dla -exec
Polski portal Debiana: http://dug.net.pl/
sir_herrbatka
Zakręcona Traszka
Zakręcona Traszka
Posty: 587
Rejestracja: 10 maja 2009, 14:44
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: przemianowywanie plików w bashu

Post autor: sir_herrbatka »

czyli gdy chcę dodać opcję dla mojego unzip to generalnie

Kod: Zaznacz cały

find -name "*.zip" -exec unzip '{}'  --opcja ';'
Dziękuję jeszcze raz, wygląda to na dość logiczne.
mortywd
Sędziwy Jeż
Sędziwy Jeż
Posty: 35
Rejestracja: 30 lis 2007, 19:22
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME

Odp: przemianowywanie plików w bashu

Post autor: mortywd »

Metody powyżej opisanej nie znałem, dzieki, że ją dyskutujecie :)
Do tej pory tego typu rzeczy robiłem w ten sposób:
np. jeśli chcę usunąć stały przedrostek 'bla':

Kod: Zaznacz cały

ls | sed/bla// | awk '{print "mv bla"$0" $0}' | bash 
czyli po kolei:
1. listuję pliki
2. usuwam ciąg znaków (podmieniam na pusty)
3. wypisuję komentdę zmieniającą odpowiednią nazwę
4. wysyłam do bash, żeby wykonał
Oczywiście, zwłaszcza w przypadkach bardziej skomplikowanych najpierw wykonam bez ostatniego etapu żeby sprawdzić, czy działa zgodnie z oczekiwaniem
Ze względu na potęgę sed i awk powyższe można rozbudowywać do monstrualnych rozmiarów, np. chcę przekonvertować część plików do innego formatu graficznego:

Kod: Zaznacz cały

ls | awk 'BEGIN{FS="."}; $1~/ferie/ && ( $2~/jpg/ || $2~/JPG/ ) {print "convert "$0" "$1".png"}' | bash
czyli przetwarzam tylko pliki zawierające w nazwie ciąg 'ferie' i będące w formacie jpg. Powyższe się wysypie jeśli w nazwie jest kropka i nie obsłuży plików *.jpeg, ale zasada chyba jest jasna.

Oczywiście wszędzie gdzie się da sposób dyskutowany w powyższych postach będzie elegantszy i zapewne szybszy. Ja po prostu prawie wszystko robię sed+grep+awk.
sir_herrbatka
Zakręcona Traszka
Zakręcona Traszka
Posty: 587
Rejestracja: 10 maja 2009, 14:44
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: przemianowywanie plików w bashu

Post autor: sir_herrbatka »

uła!, A nie używasz w takich wypadkach "for" i "do"? Pytam bo uczę się basha od hmmm wczoraj :D i wcześniej nie miałem żadnego kontaktu z niczym z okolicy programowania :)
Awatar użytkownika
azhag
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 151
Rejestracja: 24 maja 2010, 19:30
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Fluxbox
Architektura: x86
Kontakt:

Odp: przemianowywanie plików w bashu

Post autor: azhag »

sir_herrbatka pisze:uła!, A nie używasz w takich wypadkach "for" i "do"?
Przyłączam się do pytania: dlaczego nie

Kod: Zaznacz cały

for FILE in *.jpg *.jpeg; do ...

A jeśli już, to:
- dlaczego

Kod: Zaznacz cały

awk '{print "mv bla"$0" $0}' | bash
zamiast

Kod: Zaznacz cały

awk '{system("mv bla"$0" "$0)}'
- za pomocą ls się plików nie szuka
Polski portal Debiana: http://dug.net.pl/
mortywd
Sędziwy Jeż
Sędziwy Jeż
Posty: 35
Rejestracja: 30 lis 2007, 19:22
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME

Odp: przemianowywanie plików w bashu

Post autor: mortywd »

Jeśli chodzi o for...do przyczyna jest dość kuriozalna: bo się nauczyłem awk wcześniej niż bash na odpowiednim poziomie.
Awk wykonuje zadaną akcję dla każdej linii pasującej do wzorca.
Zresztą myślę, że przy bardziej skomplikowanych operacjach w bash trzeba by nieźle kombinować z wyrażeniami regularnymi - od tego jest awk.

Funkcji system() nie znałem - dzięki :)

Cóż, jestem użytkownikiem - potrzebuję coś zrobić, to szukam sposobu. Czasem jest on daleki od elegancji programistycznej - jak potrzebuję wygenerować kod, który wstawi 20 obrazków z różnych folderów o długich nazwach do dokumentu LaTeX'a to używam w pierwszej kolejności tych metod, które już znam.
Może więc powiniennem wypowiadanie się zostawić programistom (t.j. tym, którzy poświęcili odpowiednio dużo czasu na dogłęgne poznanie każdego z narzędzi i nauczenie się poprawnych metod)?
Serio pytam.
sir_herrbatka
Zakręcona Traszka
Zakręcona Traszka
Posty: 587
Rejestracja: 10 maja 2009, 14:44
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: przemianowywanie plików w bashu

Post autor: sir_herrbatka »

jeśli chodzi o mnie, to nie ma nic złego w poznawaniu różnych rozwiązań - sam jednak wolę jednak opanować jakoś w miarę nieźle basha - zwłaszcza, że ten awk sprawia wrażenie dość trudnego :/
mortywd
Sędziwy Jeż
Sędziwy Jeż
Posty: 35
Rejestracja: 30 lis 2007, 19:22
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME

Odp: przemianowywanie plików w bashu

Post autor: mortywd »

Argument za używaniem

Kod: Zaznacz cały

 ... | bash 
jest taki, że można wtedy obejżeć co zostanie zrobione - raz wywołuję całość bez ostatniego przekierowania, a potem przywołuję (kursor w górę) i dopisuję wywołanie. Przydatne gdy się jest początkującym/roztargnionym/... -- lepiej sprawdzić co zostanie wykonane zanim dane pójdą na spacer.

Jeśli chodzi o AWK to jest prosty. A raczej jest tak prosty jak zadanie, które chcesz wykonać ;)
Podstawowa składnia to

Kod: Zaznacz cały

awk ' wzorzec {polecenia}' plik_do_analizy
przy czym jeden z elementów zawartych w ' ' możesz opuścić - zostanie zastąpiony domyślnym:
* brak wzorca => dla każdej linii
* brak akcji => wypisz całą linię

Można myśleć o AWK jak o czymś, co każdy plik traktuje jak bazę danych - każda linia to osobny rekord. Domyślnym separatorem pól w linii jest dowolny ciąg spacji i tabulacji.
Wartości kolejnych pól uzyskujesz przez $1, $2, ...
np.

Kod: Zaznacz cały

 awk '$2~/Kowalski/ {print $1}' spis_lokatorow.txt 
wypisze imiona wszystkich Kowalskich w bloku.
Oczywiście można robić rzeczy znacznie bardziej skomplikowane -- trudność polecenia zależy od trudności zadania (i Twojej znajomości języka - często można coś zrobić na około: jak rozmawiam w obcym języku to czasem brakuje mi właściwego słowa).

Jest do tego fajna dokumentacja po polsku. Ja oczywiście nie czytałem całości, tylko zaglądam to tych kawałków, które sa mi potrzebne. Dlatego też o różnych rzeczach nie wiem.

Oczywiście jak najbardziej zachęcam Cię do uczenia się Bash'a :)
Na początek proponuję
http://www.ournet.pl/kursbasha/main.html dostępny też tu: http://ultra.ap.krakow.pl/~bar/kursbasha/main.html
oraz http://student.agh.edu.pl/~kdzwinel/linux/bash.html
Są to dość krótkie "kursy" -- w sam raz na początek. Chyba, że jesteś z tych zdolnych do przeczytania całej dokumentacji, ale w tym przypadku ja wymiękam:

Kod: Zaznacz cały

$ man bash | wc
   4924   37309  284608
Przeczytaj też http://jakilinux.org/administracja/pora ... -w-unixie/
bo najlepiej od razu nabywać dobrych (skutecznych) zwyczajów. Ja to przeczytałem po jakiś 5 latach używania Bash no i na paru rzeczach się złapałem :bag:
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

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