mywiki/linux/find.md

144 lines
4.2 KiB
Markdown

# find
Il comando **find** permette di cercare files e non solo da riga di comando.
Se il percorso del file non è specificato, viene ricercato nella directory corrente e nelle sue sottodirectory.
Questa la sua struttura generale:
```bash
find path pattern
```
## Ricercare un file per nome
```bash
find -iname abc.txt
```
In questo modo, viene cercato il file abc.txt (-i sta per insensitive) nella cartella corrente.
### Specificare il tipo del pattern
```bash
find /etc -type f -name "*.conf"
```
dove il tipo del file può essere:
| -type | Descrizione |
|-------|-------------|
| f | File |
| d | Directory |
| l | Link |
## Ricercare in più cartelle
```bash
find ~/Desktop/example1/ ~/Desktop/example2/ -name 'abc*.*'
```
## size
Ricercare solo file più grandi di...
```bash
find -size +2000M
```
## Esclusione di alcuni file dalla ricerca
Il comando find può anche escludere alcuni tipi di file dal risultato della ricerca:
```bash
find -name '*abc*' -type f \( ! -name '*.msi' \)
```
Nell'esempio, vengono esclusi tutti i file *\*abc\*.msi*
## exec
È possibile eseguire comandi sui risultati di find.
La sintassi di base per eseguire la ricerca con exec è la seguente:
```bash
find [path] [arguments] -exec [command] {} \;
```
- *[comand]* il comando da eseguire;
- *{}* è un segnaposto per i risultati dati dal comando find;
- *\;* che per ogni risultato trovato, il [comand] viene eseguito, ossia, come se fossero passati in questo modo:
```bash
ls file1.txt
ls file2.txt
ls file3.txt
```
### Alcuni esempi
Rinominare i file
```bash
> sudo find . -type f -name file\* -exec ls -l {} \;
-rw-r--r-- 1 davide davide 0 9 apr 15.50 ./file2.txt
-rw-r--r-- 1 davide davide 0 9 apr 15.50 ./file7.txt
-rw-r--r-- 1 davide davide 0 9 apr 15.50 ./file4.txt
-rw-r--r-- 1 davide davide 0 9 apr 15.50 ./file8.txt
-rw-r--r-- 1 davide davide 0 9 apr 15.50 ./file10.txt
-rw-r--r-- 1 davide davide 0 9 apr 15.50 ./file1.txt
-rw-r--r-- 1 davide davide 0 9 apr 15.50 ./file9.txt
-rw-r--r-- 1 davide davide 0 9 apr 15.50 ./file5.txt
-rw-r--r-- 1 davide davide 0 9 apr 15.50 ./file3.txt
-rw-r--r-- 1 davide davide 0 9 apr 15.50 ./file6.txt
> sudo find . -type f -name file\* -exec mv {} {}_renamed \;
> ll
Permissions Size User Date Modified Name
.rw-r--r-- 0 davide 9 apr 15:50  file1.txt_renamed
.rw-r--r-- 0 davide 9 apr 15:50  file2.txt_renamed
.rw-r--r-- 0 davide 9 apr 15:50  file3.txt_renamed
.rw-r--r-- 0 davide 9 apr 15:50  file4.txt_renamed
.rw-r--r-- 0 davide 9 apr 15:50  file5.txt_renamed
.rw-r--r-- 0 davide 9 apr 15:50  file6.txt_renamed
.rw-r--r-- 0 davide 9 apr 15:50  file7.txt_renamed
.rw-r--r-- 0 davide 9 apr 15:50  file8.txt_renamed
.rw-r--r-- 0 davide 9 apr 15:50  file9.txt_renamed
.rw-r--r-- 0 davide 9 apr 15:50  file10.txt_renamed
```
Eliminare i file più grandi di...
```bash
find ~/Desktop -size +100M -exec rm {} \;
```
Modificare proprietario dei file:
```bash
> sudo find . -type f -name file\* -exec chown root:root {} \;
> ll
Permissions Size User Date Modified Name
.rw-r--r-- 0 root 9 apr 15:50  file1.txt_renamed
.rw-r--r-- 0 root 9 apr 15:50  file2.txt_renamed
.rw-r--r-- 0 root 9 apr 15:50  file3.txt_renamed
.rw-r--r-- 0 root 9 apr 15:50  file4.txt_renamed
.rw-r--r-- 0 root 9 apr 15:50  file5.txt_renamed
.rw-r--r-- 0 root 9 apr 15:50  file6.txt_renamed
.rw-r--r-- 0 root 9 apr 15:50  file7.txt_renamed
.rw-r--r-- 0 root 9 apr 15:50  file8.txt_renamed
.rw-r--r-- 0 root 9 apr 15:50  file9.txt_renamed
.rw-r--r-- 0 root 9 apr 15:50  file10.txt_renamed
```
Eliminare tutti i file corrispondenti ad un pattern di ricerca:
```bash
> sudo find . -type f -name file\* -exec rm -rf {} \;
> ll
```
## Collegamenti
- [https://linuxhandbook.com/find-files-by-name/](https://linuxhandbook.com/find-files-by-name/)
- [https://linuxhandbook.com/find-exec-command/](https://linuxhandbook.com/find-exec-command/)
- [https://www.ionos.it/digitalguide/server/configurazione/comando-find-di-linux/](https://www.ionos.it/digitalguide/server/configurazione/comando-find-di-linux/)