Come eliminare i principali "./" in unix "find"?


140
find . -type f -print

stampa

./file1
./file2
./file3

Qualsiasi modo per farlo stampare

file1
file2
file3

?


1
se hai usato -exec /path/to/myscript.sh {} nel tuo find, il -printf '%P\n'non funziona. Invece, devo fare il ./prefisso chomping all'interno della sceneggiatura da:p=${1#"./"}
truthadjustr

Se lo fai solo per un singolo file:f=`find . -name migration`; echo ${f/.\//}
masterxilo

Risposte:


38

Se sono solo nella directory corrente

find * -type f -print

È questo che vuoi?


21
Ciò mancherà i file con nomi che iniziano con un punto.
Sean,

2
Cattivo, a seconda delle impostazioni di una shell * potrebbe non essere valutato in file / directory "nascosti" - quelli che iniziano con punto (.) Prova a eseguire questo comando nella tua home directory, quindi semplicemente "trova -tipo f" e vedi la differenza .
Ilia K.

35
Una preoccupazione più rilevante è che '*' viene valutato dalla shell. Hai effettivamente un tipo di situazione di iniezione di codice dannoso. Sarebbe banale creare un file chiamato '--exec rm' e un altro chiamato 'zzzz;'. Addio file.
CWF

6
Questo non è sicuro. Se il nome di un file inizia con un trattino, verrà trattato come un'opzione da trovare e potrebbe non riuscire o potrebbe potenzialmente causare danni.
Dale Anderson,

4
Perché è -printrichiesto? Ha dato lo stesso risultato senza quella bandiera.
user13107

239

Trova solo i file regolari nella directory corrente e stampali senza il ./prefisso " ":

find -type f -printf '%P\n'

Da man find, descrizione del -printfformato:

% P Nome del file con il nome dell'argomento della riga di comando in base al quale è stato trovato rimosso.


18
+1 Buona soluzione se la tua versione di findsupporti -printf(non tutti lo fanno).
Todd Owen,

2
Come diceva Todd, ma più precisamente: non è POSIX 7.
Ciro Santilli 16 冠状 病 六四 事件 法轮功

8
Supportato o no, è sicuramente più sicuro della risposta accettata.
Dale Anderson,

10
Puoi usarlo \0invece \nse vuoi reindirizzarlo xargs -0(ad es. Nel caso in cui i nomi dei file contengano spazi bianchi), ad es.find -type f -printf '%P\0' | xargs -0 head
seanf

1
@Quanlong, funziona su macOS se tu brew install findutils;)
blockloop

58

Usa sed

find . | sed "s|^\./||"

2
Questa è la mia soluzione preferita; è compatibile con POSIX (funziona praticamente ovunque, anche con sistemi integrati), molto breve e difficilmente provoca comportamenti imprevisti. Questa dovrebbe essere la risposta accettata.
Jody Bruchon,

6
Come si combinerebbe questo find -exec?
Paul Wintz,

find -exec sh -c "echo {} | sed 's|^\./||'" \; oppure find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb,

12

può essere più breve

find * -type f

Meglio 2> /dev/nullignorare l'errore segnalato quando il comando viene eseguito in una directory vuota.
Neevek,

2

Un altro modo di eliminare lo ./è usando cutcome:

find -type f | cut -c3-

Ulteriori spiegazioni possono essere trovate qui


2

Un altro modo di mettere a nudo il ./

find * -type d -maxdepth 0

Sebbene questo codice possa risolvere la domanda, inclusa una spiegazione di come e perché questo risolva il problema, contribuirebbe davvero a migliorare la qualità del tuo post e probabilmente darebbe più voti positivi. Ricorda che stai rispondendo alla domanda per i lettori in futuro, non solo per la persona che chiede ora. Modifica la tua risposta per aggiungere spiegazioni e fornire un'indicazione di quali limitazioni e ipotesi si applicano.
David Buck,

2

Poiché l' -printfopzione non è disponibile su OSX, findecco un comando che funziona su OSX find, nel caso in cui qualcuno non volesse installare gnu findusando brewetc:

find . -type f -execdir printf '%s\n' {} + 

1
Sfortunatamente questo rimuove l'intero percorso di ogni file trovato, comprese le sottodirectory intermedie, e stampa semplicemente il nome file stesso.
PLL

1
Hai ragione. Questa soluzione è valida solo per i file nella directory corrente. Per i file nidificati dobbiamo usare:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
anubhava
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.