Find è il più potente fra i programmi di ricerca.
Importante la possibilità di eseguire automaticamente determinate operazioni su tutti i file trovati, tramite:
exec e execdirok e okdirxargs (sconsigliato, vedi Find: Security Considerations)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
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
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
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).
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.
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
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-
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
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
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.
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
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
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/
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
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
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.
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
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
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.