Perché finisco con 4 invocazioni invece di 3 quando utilizzo questo find -execdir {} + (plus)?


8

Ho letto qui che puoi contare il numero di invocazioni di commandin -exec command {} +tramite piping | wc -lfino alla fine.

Anche se capisco che -execdirè diverso, in quanto, per ogni sottodirectory corrispondente che viene findrilevata, esegue un'invocazione commanddalla sottodirectory in cui è contenuta, se ho più di un file corrispondente in una sottodirectory, non dovrebbe finirò con il numero di invocazioni uguale al numero di sottodirectory corrispondenti e non il numero di invocazioni che corrispondono al numero di file corrispondenti in quelle sottodirectory?

Sto finendo con quest'ultimo quando eseguo quanto segue:

$ find . -name "bob*" -execdir echo {} + | wc -l

La pagina man per gli execdir command {} +stati afferma che il primo dovrebbe essere il caso:

Come per l' -execazione, il +modulo di -execdircostruirà una riga di comando per elaborare più di un file corrispondente, ma ogni invocazione data di commandelencherà solo i file presenti nella stessa sottodirectory.


vale a dire

Sto ottenendo:

./file1inDir1
./file2inDir1
./file3InDir2
./file4InDir3

Quando me lo aspetto, in base alla pagina man:

./file1inDir1 ./file2inDir1
./file3InDir2
./file4InDir3

In questo modo non puoi contare le invocazioni di comandi in generale. Se il comando è echoe gli argomenti sono generati da {} +e non ci sono nuove righe nei nomi dei file (la maggior parte delle persone non lo fa) ALLORA il numero di righe è il numero di invocazioni e funziona. Se il comando dice head -n 999000 /dev/urandomche va orribilmente storto.
dave_thompson_085,

Risposte:


11

Questo è un problema di prestazioni di find. Nella findutilsversione 4.3.4, una soluzione alternativa doveva limitare il numero di argomenti che -execdir ... {} +verranno utilizzati a 1. Nella versione 4.5.9 il limite è stato rimosso.

Vedi un esempio:

$ mkdir -p dir{1..3}
$ touch dir{1..3}/file1 dir2/file{1..3}
$ find
.
./dir1
./dir1/file1
./dir2
./dir2/file1
./dir2/file2
./dir2/file3
./dir3
./dir3/file1

Con -execdir {} +, il comando dovrebbe essere eseguito 3 volte. La seconda invocazione dovrebbe avere 3 argomenti.

Con find4.4.2:

$ find-4.4.2 . -name "file*" -execdir sh -c 'echo "Executing $@ in $(pwd)"' find-sh {} +
Executing ./file1 in /path/to/dir1
Executing ./file1 in /path/to/dir2
Executing ./file2 in /path/to/dir2
Executing ./file3 in /path/to/dir2
Executing ./file1 in /path/to/dir3

Con find4.6.0:

$ find-4.6.0 . -name "file*" -execdir sh -c 'echo "Executing $@ in $(pwd)"' find-sh {} +
Executing ./file1 in /path/to/dir1
Executing ./file1 ./file2 ./file3 in /path/to/dir2
Executing ./file1 in /path/to/dir3
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.