Come trovare solo i file in una determinata directory e ignorare le sottodirectory usando bash


130

Ho esaminato altre domande simili, ma non ne ho trovata una che mi permettesse di comprendere il concetto e renderlo applicabile alla mia situazione in base al mio tempo limitato. Sto semplicemente eseguendo il comando find per trovare determinati file, ma alcuni file nelle sottodirectory hanno lo stesso nome che voglio ignorare. Grazie per qualsiasi aiuto. Di seguito è il comando che sto usando:

I file / pattern che mi interessano: / dev / abc-scanner, / dev / abc-cash ....

Il comando:

find /dev/ -name 'abc-*'

Cosa viene restituito:

/dev/abc-scanner
/dev/abc-cash
...
...
...
/dev/.udev/names/abc-scanner
/dev/.udev/names/abc-cash

Voglio ignorare questi ultimi file: /dev/.udev / ...


9
ignorare specifiche sottodirectory o non scendere in nessuna sottodirectory? Per quest'ultimo, usa l'opzione -maxdepth 1
frankc

@frankc Posta come risposta.
cnicutar,

Risposte:


203

Se vuoi solo limitare la ricerca al primo livello puoi fare:

 find /dev -maxdepth 1 -name 'abc-*'

... o se si desidera escludere in particolare la .udevdirectory, è possibile:

 find /dev -name '.udev' -prune -o -name 'abc-*' -print

Se volessi elencare dove tutti i link simbolici sopra indicati puntavano a trovare nel modello precedente, avrei usato solo una pipe? Qualcosa come find / dev -maxdepth 1 -name 'abc- *' | ls -l
suffa

1
È meglio usare xargsinvece, quindi qualcosa del genere: find /dev -maxdepth 1 -name 'abc-*' | xargs ls -lma se c'è qualche possibilità che abbiano spazi bianchi nei nomi, dovresti farlofind /dev -maxdepth 1 -name 'abc-*' -print0 | xargs -0 ls -l
Mark Longair,

Tuttavia, come sottolinea la risposta di Stephen Darlington , non sono sicuro del perché non dovresti farlols -l /dev/abc-*
Mark Longair,

Inoltre, se vuoi scoprire dove puntano i for x in /dev/abc-*; do readlink -f $x; done
link

1
O se vuoi le sottodirectory solo al primo livello, ls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev... tranne che sul mio Linux /dev/*/*non include i file in /dev/.udev/*modo da poter omettere fgrep -v.
tripleee

9

C'è qualche motivo particolare che devi usare find? Puoi semplicemente usare lsper trovare file che corrispondono a un modello in una directory.

ls /dev/abc-*

Se è necessario utilizzare find, è possibile utilizzare l' -maxdepth 1opzione per applicare solo alla directory specificata.


Penso che intendi -maxdepth 1piuttosto che-maxdepth 0
Mark Longair il

5
Va sottolineato che il carattere jolly è la parte importante qui, non ls. Puoi trovare gli stessi file con echoo wco cosa hai, perché la shell espande il carattere jolly per te. Quindi for file in /dev/abc-*; do something with each "$file"; donepotrebbe essere quello che l'OP sta effettivamente cercando.
Tripleee

1
Ah, non ricordo mai da che parte è ... Grazie per la modifica. Inoltre, vale la pena notare che non è universale. La versione di Solaris di findnon ce l'ha ad esempio.
Stephen Darlington,

@tripleee +1. Sì. Fare tutto nella shell sarebbe preferibile, se possibile.
Stephen Darlington,

1
@MustafaOzturk The lsis superfluous. for f in abc*; ...é tutto quello di cui hai bisogno.
Stephen Darlington,

4

Questo può fare quello che vuoi:

find /dev \( ! -name /dev -prune \) -type f -print

2
Sì, funziona. -maxdepth non è implementato in find su alcuni vecchi Unix.
CCTO,

-1
find /dev -maxdepth 1 -name 'abc-*'

Non funziona per me. Non restituisce nulla. Se lo faccio e basta "." mi dà tutti i file nella directory sotto quella su cui sto lavorando.

find /dev -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls

Non restituire nulla con "." invece ottengo un elenco di tutti i file "grandi" nella mia directory, nonché i file root / directory in cui memorizzo quelli vecchi.

Continuando. Questo funziona

find ./ -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls
564751   71 -rw-r--r--   1 snyder   bfactory   115739 May 21 12:39 ./R24eTightPiPi771052-55.root
565197  105 -rw-r--r--   1 snyder   bfactory   150719 May 21 14:27 ./R24eTightPiPi771106-2.root
565023   94 -rw-r--r--   1 snyder   bfactory   134180 May 21 12:59 ./R24eTightPiPi77999-109.root
719678   82 -rw-r--r--   1 snyder   bfactory   121149 May 21 12:42 ./R24eTightPiPi771098-10.root
564029  140 -rw-r--r--   1 snyder   bfactory   170181 May 21 14:14 ./combo77v.root

Apparentemente /dev significa directory di interesse. Ma ./è necessario, non solo .. La necessità del /non era ovvia anche dopo aver capito cosa /devsignificava più o meno.

Non ho potuto rispondere come commento perché non ho una "reputazione".


1
Guadagni reputazione dando buone risposte. Si prega di leggere questo stackoverflow.com/conduct
aifrim

Ci sono ragioni per le quali non sei autorizzato a commentare e che non ti dà il permesso di inserire commenti qui nella sezione Risposta. Si prega di eliminare questo.
Rob,
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.