Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Nie zrobisz tego w domyślnym menadżerze plików

Wpis może rozpocznie serię artykułów z cyklu w konsoli lepiej, jako iż jest to ostatnio dosyć modny temat, a nikt go nie wyczerpuje lub przykłady są nieco niepraktyczne. Oczywiście będę opisywać powłokę tekstową Bash, domyślnie instalowaną w wielu dystrybucjach Linuksa, mogącą pracować w trybie kompatybilności /bin/sh .

Zaczniemy od zakładania struktury katalogów, jako iż wszelkie operacje w menadżerze plików dokonujemy na katalogach lub otwieramy pliki w zewnętrznych programach.

Do założenia hierarchicznej struktury katalogów służy: mkdir -p Media/{Ważne,Ciekawe}/{Filmy,Dźwięki,Zdjęcia} Dokumenty/Ważne

Powyższe polecenie utworzy nam 9 katalogów. Katalog Media będzie mieć następującą strukturę:
Media/Ważne/Filmy
Media/Ważne/Dźwięki
Media/Ważne/Zdjęcia
Media/Ciekawe/Filmy
Media/Ciekawe/Dźwięki
Media/Ciekawe/Zdjęcia

Katalog Dokumenty natomiast:
Dokumenty/Ważne

Kolejnym etapem jest wyszukiwanie z ograniczeniami. W większości narzędzi graficznych dołączanych do systemów operacyjnych nie mamy zbyt wielu opcji do ograniczenia parametrów wyszukiwania plików, jak choćby głębokości find . -maxdepth 2 -name *.txt Spowoduje znalezienie plików z rozszerzeniem txt w naszym katalogu, jak i w bezpośrednich dzieciach.

W wielu narzędziach konsolowych możemy odnaleźć opcje odnoszące się do zachowania w przypadku napotkania dowiązania symbolicznego. Mało programów graficznych, w tym menadżerów plików pozwala na ustawianie takich opcji. Jednym z chlubnych przykładów programów zezwalających ustawianie opcji z tym związanych jest K3B.
Tutaj znowu możemy programowi find narzucić podążanie za dowiązaniami symbolicznymi bądź nie.

Szybkie kopiowanie do katalogu domowego jest osiągalne w środowisku tekstowym. O ile szanuję swój Pulpit, i nie trzymam śmieci, to o tyle mam inne zdanie odnośnie korzenia mojego katalogu domowego (kropki). Można tam na szybko coś skopiować, i się nie przejmować tym, że zajmuje nam miejsce na pulpicie, a my nie mamy czasu. Trzeba jednak pamiętać o regularnym dzieleniu plików na odpowiednie podkatalogi. cp pliczek ~

Wyświetlanie wszystkich pliczków danego typu file * | grep -E '[mM]ovie|[fF]lash|[vV]ideo'

Segrecja plików w rzeczywistości, jak i bez ingerencji.
Bez ingerencji: mkdir -p ~/pendrive/{PDFy,Filmy,Muzyka} find /media/pendrive -name '*' -print0 | xargs -0 /bin/sh -c ' while [ ! ${#@} -eq 0 ]; do if file "$1" | grep -E [mM]ovie|[fF]lash|[vV]ideo; then ln -s "$1" ~/pendrive/Filmy/; elif file "$1" | grep -E [mM]usic|[vV]oice|[sS]pech|AAC; then ln -s "$1" ~/pendrive/Muzyka/; elif file "$1" | grep -E [pP]ostscript|[dD]ocument; then ln -s "$1" ~/pendrive/Dokumenty; fi ' -- W powyższym przykładzie nie zapobiegamy konfliktom nazw!! Może zdarzyć się, że jakiś z dokumentów nie będzie dostępny.

By je segregować przenosząc do odpowiedniego katalogu, to wystarczy ciąg ln -s zastąpić przez cp .
Rozwiązać problemy z nazwami można wrzucając dowiązania do nowo utworzonego katalogu w katalogu dokumentu źródłowego. Jednak osiągnięcie celu wymagałoby zbyt wielu przeróbek.

Segregacje plików można wykorzystywać do porządkowania plików zapisanych bezpośrednio w katalogu domowym. Nie można jednak mu zaufać całkowicie, bo wtedy nie naprawiamy bałaganu - najpierw trzeba przenosić dokumenty, które mają dla nas szczególne znaczenie ręcznie. 

Komentarze

0 nowych
webnull   9 #1 13.01.2011 16:18

Świetny artykuł, ja także podam Swój przykład.

Mamy pliki:
/usr/share/icons/gnome/32x32/qwerty.png
/usr/share/icons/gnome/64x64/qwerty.png
/usr/share/icons/gnome/128x128/qwerty.png

Przy pomocy gwiazdki możemy usunąć jeden plik z trzech katalogów naraz:
rm /usr/share/icons/gnome/*/qwerty.png

Ostatnio właśnie takim łatwym sposobem usunąłem konfliktujące pliki nie należące do żadnej paczki zainstalowanej przez menadżer pakietów.

Karach   3 #2 13.01.2011 18:55

Sortowanie to dość ciekawy przykład. Ja bym tam może podopisywał jeszcze jakieś popularne rozszerzenia (filmy - avi, ogg, mkv, itp. <- itp. to nie rozszerzenie :P ). Ale to przecież nic trudnego, jak ktoś potrzebuje to sobie dopisze. ;)

borzole   4 #3 13.01.2011 20:33

Na miłość boską, słyszałeś o formatowaniu kodu?

Druga sprawa co do samego użycia xargs, można to zapisać tak:


#!/bin/bash

while read line ; do
if file "$line" | grep -E [mM]ovie|[fF]lash|[vV]ideo
then
ln -s "$line" ~/pendrive/Filmy/
elif file "$line" | grep -E [mM]usic|[vV]oice|[sS]pech|AAC
then
ln -s "$line" ~/pendrive/Muzyka/
elif file "$line" | grep -E [pP]ostscript|[dD]ocument
then
ln -s "$line" ~/pendrive/Dokumenty
fi
done < <(find /media/pendrive)



borzole   4 #4 13.01.2011 20:45

Tak właśnie mi przyszło do głowy jak można w bash ładować ścieżki do tablic (jak i do czego to wykorzystać to jeszcze nie wiem):



#!/bin/bash

while IFS=$'/' read -a line ; do
IFS=$'/' path=$(for p in ${line[*]} ; do echo -n "/$p" ; done)
path=${path#/}
echo ' ----------------------------------------------- '
IFS=$' \n\t'
echo $path
echo ${line[*]}
for p in ${!line[*]} ; do
echo -e "\t $p:${line[$p]}"
done
done < <(find ~/temp -name '*')

borzole   4 #5 13.01.2011 21:03

To jeszcze raz ja ;P
Robiłem ostatnio skrypt monitorujący log systemowy. Można napisać prostego demona w bash, który zareaguje na podpięcie pendrive i wykona sortowanie automatycznie. Oczywiście można użyć dbus lub coś innego.

# tworzymy potok nazwany
mkfifo /tmp/my.fifo

# przekierowujemy ciągłe wyście z logu na potok
tail -f -n 0 /var/log/messages >> /tmp/my.fifo

# i nasłuchujemy w nieskończonej pętli,
# aż w logu pojawi się sekwencji podłączenia pendriva
while read line ; do
if echo "$line" | grep 'New USB device found'
then
echo "Podłączono USB: $line"
fi
done < /tmp/my.fifo

  #6 14.01.2011 18:30

@borzole | 13.01.2011 20:33 :
Twój sposób jest dobry, ale przyjąłem, że ktoś może mieć znaki przejścia do nowej linii w nazwach plików. Wiem, że to przesada, ale lepiej by rozwiązanie działało ;-) .

nintyfan   10 #7 14.01.2011 18:33

@borzole | 13.01.2011 20:33 :
Z Basha dobry nie jestem, ale skąd wziął się zapis polecenie < <(polecenie2) ? Rozumiem, co też sprawdziłem, że zapis ten oznacza "wyjście z polecenie 2 przekieruj na wejście polecenia 1".
Mam rozumieć, że <(polecenie) automatycznie nakazuje traktować potok, jak plik?

W nowszych Bashash istnieje coś takiego, jak readarray .

borzole   4 #8 14.01.2011 21:08

A tak zapomniałem, trzeba wstawić "read -r" i może mieć znak nowej linii w nazwie.
więcej w: help read

Co do zapisu, to nie kumam zbytnio przekierowań deskryptorów. Wiem tylko tyle, że ten zapis działa :)
Nie chodzi o to, że polecenie2 staje się plikiem, tylko że jego wyjście zostaje przekierowane na deskryptor pliku '0', a polecenie1 czyta z tego deskryptora.
Tak naprawdę, można by równie dobrze zrobić

find ... | while read ...

jednak wówczas pętla while traktowana jest jak subshell i żadne parametry z pętli nie są dostępne poza nią. Akurat tutaj nie ma to znaczenia, ale warto zapamiętać, że "wpąpowywanie od tyłu" nie tworzy subshell'a.

To w jaki sposób skrypt czyta parametry wejściowe jest zapisane w

readlink /proc/$$/fd/0

stan tego pliku pozwala określić, czy dane są przekazane ze zwykłego potoku, parametru, czy pliku. Przykład

http://www.linuxquestions.org/questions/linux-software-2/bash-scripting-pipe-inp.../

mapfile (readarray) też jest fajnym poleceniem, w starszej wersji bash to samo robi:

IFS=$'\n' lines=( $( < $plik) )

tomimaki   6 #9 15.01.2011 02:30

Szkoda, że Ciebie nie ma na blogu, borzole.

tomimaki   6 #10 15.01.2011 02:32

A zaraz. Masz swoją stronę. No to też powędrowała do RSS. :)

borzole   4 #11 15.01.2011 13:34

@tomimaki
tylko ostrożnie, wszystko na moim blogu to jeden wielki garaż połowicznie działających eksperymentów o wątpliwej przydatności :D

tomimaki   6 #12 15.01.2011 21:34

@borzole
Bez obawy. To jest bardziej na zasadzie teoretycznych rozważań "A co to jest i jak to działa?". Może czegoś się nauczę? ;)