Ricerche

Loris Tissino

29 giugno 2009

Find

Find è il più potente fra i programmi di ricerca.

Importante la possibilità di eseguire automaticamente determinate operazioni su tutti i file trovati, tramite:

Ad esempio:

$ find -iname '*.c' -exec chmod 700 {} \;   # imposta permessi 700 a tutti i file con estensione .c
$ find -iname '*.c' -execdir chmod 700 {} \;   # come sopra, ma con maggior sicurezza
$ find -iname '*.c' -okdir chmod 700 {} \;   # come sopra, ma chiede conferma ogni volta
$ find -iname '*.c' -exec chmod 700 {} +   # unica invocazione del comando, con la lista dei parametri

Find - permessi sui file

Il criterio di ricerca basato sui permessi può essere impostato sulla ricerca dei file che hanno esattamente determinati permessi, oppure che hanno (almeno) uno di o tutti i permessi specificati.

$ find -type f -perm 0500 -exec ls -l {} \;   # trova solo i file con i permessi u=rx
-r-x------ 1 loris loris 0 2008-04-19 17:17 ./0500_file
$ find -type f -perm -0500 -exec ls -l {} \;  # trova i file con entrambi i permessi u=rx
-rwx------ 1 loris loris 0 2008-04-19 17:17 ./0700_file
-r-x------ 1 loris loris 0 2008-04-19 17:17 ./0500_file

$ find -type f -perm /0500 -exec ls -l {} \; # trova i file con almeno uno dei permessi u=rx
--wx------ 1 loris loris 0 2008-04-19 17:17 ./0300_file
-r-------- 1 loris loris 0 2008-04-19 17:17 ./0400_file
-rwx------ 1 loris loris 0 2008-04-19 17:17 ./0700_file
-r-x------ 1 loris loris 0 2008-04-19 17:17 ./0500_file
---x------ 1 loris loris 0 2008-04-19 17:17 ./0100_file
-rw------- 1 loris loris 0 2008-04-19 17:17 ./0600_file

Find - ricerche per intervalli temporali

Quando si devono elencare tutti i file da un determinato momento ad un altro, può essere utile creare dei file segnatempo, in modo da poter fare un confronto basato sulle marche temporali.

$ touch prima
$ touch /tmp/START
$ touch durante1
$ touch durante2
$ touch /tmp/STOP
$ touch dopo
$ find . -cnewer /tmp/START ! -cnewer /tmp/STOP
./durante1
./durante2

Find - esclusione di directory

Se si vuole effettuare una ricerca escludendo una directory, si può usare l'opzione -prune. Ad esempio, per cercare i file con il bit SUID impostato in tutte le directory ad esclusione di /proc, si può impartire il comando:

$ find / -path '/proc' -prune -o -perm -u+s  2> /dev/null 
/usr/bin/sudoedit
/usr/bin/sudo
[...]
/sbin/mount.nfs

Si noti l'operatore logico -o (se il percorso è /proc non elencare il file; oppure -- in caso contrario -- elencalo se il file ha il bit SUID impostato).

Ricerca interattiva all'interno di un file di testo

Se si sta usando vi o less per visualizzare un file di testo, premendo / si può attivare una funzione di ricerca all'interno del file stesso. Digitando n si trova l'occorrenza successiva del termine o dell'espressione regolare cercato.

Grep con ricorsione

Se si vuole fare una ricerca all'interno di file di testo (ad esempio, nei file di configurazione delle varie applicazioni, in /etc), si può usare il programma Grep con l'opzione di ricorsione.

$ grep -R apache /etc 2> /dev/null| head -5
/etc/apparmor.d/abstractions/svn-repositories:  # it is intended to be included in profiles for svnserve/apache2 and maybe
/etc/apache2/sites-available/default:           # This directive allows us to have apache2's default start page
/etc/apache2/sites-available/default:                # in /apache2-default/, but still have / go to the right place
/etc/apache2/sites-available/default:                #RedirectMatch ^/$ /apache2-default/
/etc/apache2/sites-available/default:   ErrorLog /var/log/apache2/error.log

Locate (Slocate)

Si basa su un indice aggiornato periodicamente con updatedb.

$ slocate gshadow
/var/backups/gshadow.bak
/usr/share/man/cs/man5/gshadow.5.gz
/usr/share/man/man5/gshadow.5.gz
/usr/share/man/fr/man5/gshadow.5.gz
/usr/share/man/sv/man5/gshadow.5.gz
/usr/share/man/ru/man5/gshadow.5.gz
/etc/gshadow
/etc/gshadow-

Whereis

Cerca programmi basandosi sul path corrente.

$ whereis cat
cat: /bin/cat /usr/share/man/man1/cat.1.gz
$ PATH=''
$ whereis cat
bash: whereis: No such file or directory

Which

Indica che programma verrebbe eseguito con un determinato comando (a meno che non si tratti di un built-in della shell).

$ which cat
/bin/cat
$ which echo
/bin/echo
$ type echo  # echo in realtà è un built-in
echo is a shell builtin

Type

Il comando type serve a indicare di che tipo è il comando indicato come parametro:

$ type dd
dd is /bin/dd
$ type echo
echo is a shell builtin
$ type if
if is a shell keyword
$ type cal
cal is hashed (/usr/bin/cal)

I comandi già impartiti nella shell corrente vengono organizzati in un hash, in modo che sia più veloce il reperimento del relativo file binario in occasione dei richiami successivi.

Lsof

Elenca i file correntemente aperti.

$ lsof | grep services
soffice.b 7373      loris  mem-R     REG        8,3  2424832 3370940 /usr/lib/openoffice/program/services.rdb
soffice.b 7373      loris   51rR     REG        8,3  2424832 3370940 /usr/lib/openoffice/program/services.rdb

Df

DiskFree. Quanto spazio su disco rimane nelle diverse partizioni?

$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda3             58317904  52921668   2433852  96% /
varrun                  972276       236    972040   1% /var/run
varlock                 972276         0    972276   0% /var/lock
udev                    972276        88    972188   1% /dev
devshm                  972276         0    972276   0% /dev/shm
lrm                     972276     34696    937580   4% /lib/modules/2.6.22-14-generic/volatile
/dev/sdb1              1949824   1920384     29440  99% /media/disk

Du

DiskUsage. Quanto spazio su disco è effettivamente occupato da una directory e/o da un file?

$ du -hS /etc/apache2/
12K     /etc/apache2/sites-available
4,0K    /etc/apache2/mods-enabled
356K    /etc/apache2/mods-available
4,0K    /etc/apache2/sites-enabled
8,0K    /etc/apache2/conf.d
24K     /etc/apache2/

A caccia di elefanti

Esempio tratto dal libro di Paolo Attivissimo e Roberto Odoardi Da Windows a Linux.

$ sudo du −m −S −x /home | sort −n −r | head -4
8039    /home/loris/Desktop/torrents/torrents_nv/docs
6806    /home/loris/importanti/qemu/os
4457    /home/images/raw_20070112
4457    /home/images/raw_20070110

Informazioni sul tipo di file

Il programma file consente di determinare il tipo di file (file compresso gzip, immagine jpeg, ecc.), e di indicare il corrispondente tipo MIME. È bene precisare che si basa sul contenuto del file, non sull'estensione:

$ file Test.odt Test.rtf
Test.odt: OpenDocument Text
Test.rtf: Rich Text Format data, version 1, ANSI

$ file --mime Test.odt Test.rtf
Test.odt: application/vnd.oasis.opendocument.text
Test.rtf: text/rtf

$ cp Test.odt Test.jpg # verifichiamo che 'file' non viene imbrogliato...
$ file Test.jpg 
Test.jpg: OpenDocument Text

Cancellazioni sicure

Se si vogliono eliminare dei file in maniera sicura (con sovrascrittura di dati casuali, anziché logica), si può usare il programma wipe.

$ wipe documentoriservato.odt 
Okay to WIPE 1 regular file ? (Yes/No) yes
Operation finished.                                                           
1 file wiped and 0 special files ignored in 0 directories, 0 symlinks removed 
but not followed, 0 errors occured.

$ wipe -q -Q 1 docum_riserv.pdf   # sovrascrittura una sola volta
Okay to WIPE 1 regular file ? (Yes/No) yes
Operation finished.                                                           
1 file wiped and 0 special files ignored in 0 directories, 0 symlinks removed 
but not followed, 0 errors occured.

Cambiare in blocco il nome di file

Capita spesso di dover ridenominare una serie di file in base a qualche criterio. Anziché usare una serie di mv, si può ricorrere al programma rename (che funziona in maniera leggermente diversa nei sistemi RedHat/Fedora e in quelli Debian/Ubuntu).

$ rename .jpg .jpeg *jpg         # RedHat/Fedora
$ rename s/.jpg/.jpeg/ *jpg      # Debian/Ubuntu

Se si hanno dei file numerati in maniera "naturale" si possono sistemare con un paio di comandi:

$ ls
foto100.jpeg  foto104.jpeg  foto12.jpeg  foto1.jpeg  foto5.jpeg  foto9.jpeg
foto101.jpeg  foto105.jpeg  foto13.jpeg  foto2.jpeg  foto6.jpeg
foto102.jpeg  foto10.jpeg   foto14.jpeg  foto3.jpeg  foto7.jpeg
foto103.jpeg  foto11.jpeg   foto15.jpeg  foto4.jpeg  foto8.jpeg

$ rename s/foto/foto0/ foto?.jpeg
$ rename s/foto/foto0/ foto??.jpeg
$ ls
foto001.jpeg  foto006.jpeg  foto011.jpeg  foto100.jpeg  foto105.jpeg
foto002.jpeg  foto007.jpeg  foto012.jpeg  foto101.jpeg
foto003.jpeg  foto008.jpeg  foto013.jpeg  foto102.jpeg
foto004.jpeg  foto009.jpeg  foto014.jpeg  foto103.jpeg
foto005.jpeg  foto010.jpeg  foto015.jpeg  foto104.jpeg

Pgrep e Pkill

Può capitare di dover cercare un processo in base al nome dell'utente, al nome dell'eseguibile, al terminale. Lo si può fare agevolmente con il programma pgrep.

Si presti attenzione alla differenza tra utente effettivo, specificato con -u (ad esempio, root per il programma passwd che ha il bit SUID impostato), e l'utente reale (-U).

Con -l si ottiene il nome dell'eseguibile oltre al PID.

Con il programma pkill si possono inviare segnali ai processi trovati.

$ pgrep -u loris -l | head -3
6883 gnome-keyring-d
6886 x-session-manag
6928 ssh-agent

Beagle (ricerche desktop)

Per effettuare ricerche generiche all'interno di testi presenti nella nostra directory e/o nei nostri messaggi di posta, possiamo utilizzare beagle, un programma che indicizza i nostri documenti.

Ne parleremo nella sezione su GNOME.