Qual'è la differenza tra find. e trova . -stampare


27

Qual è la differenza tra:

find .

e

find . -print

Cosa fa -printeffettivamente?

$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt

Risposte:


41

Dalla findutils findmanpage :

Se non viene fornita alcuna espressione, -printviene utilizzata l'espressione (ma probabilmente dovresti considerare di usare -print0comunque, comunque).

( -printè findun'espressione.)

La documentazione POSIX lo conferma:

Se non è presente alcuna espressione , -print deve essere usato come espressione.

Quindi find .è esattamente equivalente a find . -print; il primo non ha espressione, quindi -printviene aggiunto internamente.

La spiegazione di ciò -printche viene più in basso nella manpage:

-print

Vero; stampa il nome file completo sull'output standard, seguito da una nuova riga. Se stai eseguendo il piping dell'output di find in un altro programma e c'è la minima possibilità che i file che stai cercando possano contenere una nuova riga, allora dovresti prendere seriamente in considerazione l'uso -print0dell'opzione invece di -print. Vedere la sezione FILENAMI INUSUALI per informazioni su come vengono gestiti i caratteri insoliti nei nomi dei file.


Una specie di domanda per principianti, ma di che espressione stai parlando? è questa espressione regolare?
Rishi Prakash,

2
@Rishi vedi la manpage .
Stephen Kitt,

20

-printè l' azione predefinita . Alcuni findpredicati sono considerati azioni anziché filtri o condizioni . Ad esempio, -type fnon è un'azione. -execè un'azione anche se può essere utilizzata anche come condizione.

Le azioni comprendono -print, -exece -ok. Alcune findimplementazioni hanno altri predicati di azione non-standard come il -print0, -printf, -execdir, -okdir, -ls...

find files <some-predicates>

Dove nessuna delle azioni<some-predicates> contiene equivale a:

find files \( <some-predicates> \) -print

(notare le parentesi sopra che sono importanti se ci sono alcuni -ooperatori).

In caso di dubbio, è meglio utilizzare -printesplicitamente (o -exec printf '%s\0' {} +(o -print0dove disponibile) in modo che l'output possa essere post-elaborato).

L' -printazione predefinita è specificata da POSIX. Alcune vecchie findimplementazioni richiedevano un esplicito-print , ma quelle di solito non si trovano in natura al giorno d'oggi.

Si noti inoltre che alcune findimplementazioni consentono di omettere il files, nel qual caso per impostazione predefinita cercano nella directory corrente. Cioè, per loro,

find

è equivalente a

find .
find . -print

Questo non è tuttavia standard, quindi è meglio evitarlo.

All'estremità più dettagliata (e utile) dello spettro, alcune findimplementazioni consentono anche di passare percorsi di file come argomento a -fun'opzione come in:

find -f "$file1" -f "$file2" -print

Sono le uniche findimplementazioni che consentono il passaggio di percorsi di file arbitrari a find. Altre implementazioni non possono accettare percorsi di file come !o -print... quindi find "$file" -print(o anche find -- "$file" -print) presuppone che $filenon sia il nome di un findpredicato (o opzione nel primo caso).

Sfortunatamente non è nemmeno standard né portatile.


Se non è standard ed è meglio evitarlo, perché nominarlo?
Isaac,

@Isaac, perché possono essere utili / sono possibili errori di battitura ...
vonbrand,


4

In Linux non c'è differenza, ma altri sistemi (come AIX per esempio) hanno bisogno -printse vuoi che l'output del comando sia visualizzato sullo schermo.


3
Sarebbero quindi versioni molto vecchie di AIX. AIX 4.3 findnon ne ha bisogno. AIX è conforme a POSIX da decenni.
Stéphane Chazelas il

3

Per molti anni il comando find non ha avuto un'azione predefinita. Un errore comune si stava dimenticando di aggiungere l'opzione -print al comando find. Ancora oggi lo scrivo per abitudine.

Ma ad un certo punto è stato aggiunto come azione predefinita così ora find .e find . -printsono equivalenti.


1

A volte è utile usare -printesplicitamente quando si esegue un'altra azione, quindi il nome del file viene visualizzato quando viene eseguita quell'azione.

find . -print -delete

sarebbe simile a

rm -rfv *

dove -printcorrisponde a -v. Se non includi, -printi nomi dei file non vengono visualizzati.

Al fine di rendere il rmcomando ancora più simile, a proposito, emettere prima questo comando Bash

shopt -s dotglob

che renderà i *file dei punti di corrispondenza (nascosti).

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.