# 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/)
