Cara hanya menemukan file di direktori tertentu, dan mengabaikan subdirektori menggunakan bash

130

Saya melihat pertanyaan serupa lainnya, tetapi tidak menemukan satu yang akan memungkinkan saya untuk memahami konsep dan membuatnya berlaku untuk situasi saya berdasarkan waktu saya yang terbatas. Saya hanya menjalankan perintah find untuk menemukan file tertentu, tetapi beberapa file dalam sub-direktori memiliki nama yang sama yang ingin saya abaikan. Terima kasih atas bantuannya. Di bawah ini adalah perintah yang saya gunakan:

File / pola yang saya minati: / dev / abc-scanner, / dev / abc-cash ....

Perintah:

find /dev/ -name 'abc-*'

Apa yang dikembalikan:

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

Saya ingin mengabaikan file yang terakhir: /dev/.udev / ...

suffa
sumber
9
abaikan subdirektori tertentu, atau tidak masuk ke subdirektori mana pun? Untuk yang terakhir, gunakan opsi -maxdepth 1
frankc
@ Frankc Posting sebagai jawaban.
cnicutar
kemungkinan duplikat direktori kecualikan dari find. command
Reinstate Monica Please

Jawaban:

203

Jika Anda hanya ingin membatasi temuan hingga level pertama, Anda dapat melakukannya:

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

... atau jika Anda khususnya ingin mengecualikan .udevdirektori, Anda dapat melakukan:

 find /dev -name '.udev' -prune -o -name 'abc-*' -print
Mark Longair
sumber
Jika saya ingin membuat daftar di mana semua symlink di atas menunjuk untuk ditemukan dalam pola di atas, apakah saya hanya akan menggunakan pipa? Sesuatu seperti find / dev -maxdepth 1 -nama 'abc- *' | ls-l
suffa
1
Lebih baik digunakan xargssebagai gantinya, jadi kira-kira seperti ini: find /dev -maxdepth 1 -name 'abc-*' | xargs ls -ltetapi jika ada kemungkinan mereka memiliki spasi putih dalam nama, Anda harus melakukannyafind /dev -maxdepth 1 -name 'abc-*' -print0 | xargs -0 ls -l
Mark Longair
Namun, seperti yang ditunjukkan oleh jawaban Stephen Darlington , saya tidak yakin mengapa Anda tidak melakukannyals -l /dev/abc-*
Mark Longair
Juga, jika Anda ingin mencari tahu di mana symlink menunjuk, Anda dapat melakukannyafor x in /dev/abc-*; do readlink -f $x; done
Mark Longair
1
Atau jika Anda ingin subdirektori hanya di tingkat pertama, ls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev... kecuali setidaknya di Linux saya /dev/*/*tidak menyertakan file /dev/.udev/*sehingga Anda dapat menghilangkan fgrep -v.
tripleee
9

Apakah ada alasan khusus yang perlu Anda gunakan find? Anda bisa menggunakan lsuntuk menemukan file yang cocok dengan pola dalam direktori.

ls /dev/abc-*

Jika Anda perlu menggunakan find, Anda dapat menggunakan -maxdepth 1sakelar untuk hanya berlaku pada direktori yang ditentukan.

Stephen Darlington
sumber
Saya pikir maksud Anda -maxdepth 1daripada-maxdepth 0
Mark Longair
5
Harus ditunjukkan bahwa wildcard adalah bagian penting di sini, bukan ls. Anda dapat menemukan file yang sama dengan echoatauwc atau apa pun, karena shell memperluas wildcard untuk Anda. Jadi for file in /dev/abc-*; do something with each "$file"; donemungkin apa yang sebenarnya dicari OP.
tripleee
1
Ah, aku tidak pernah bisa mengingatnya ... Terima kasih untuk suntingannya. Juga, perlu dicatat bahwa itu tidak universal. Versi Solaris findtidak memilikinya misalnya.
Stephen Darlington
@ tripleee +1. Ya. Melakukan semuanya dalam shell akan lebih disukai jika memungkinkan.
Stephen Darlington
1
@MustafaOzturk Ini lstidak perlu. for f in abc*; ...itu yang kamu butuhkan.
Stephen Darlington
4

Ini dapat melakukan apa yang Anda inginkan:

find /dev \( ! -name /dev -prune \) -type f -print
Chris J
sumber
2
Ya, ini berhasil. -maxdepth tidak diimplementasikan pada find di beberapa Unix yang lebih lama.
CCTO
-1
find /dev -maxdepth 1 -name 'abc-*'

Tidak bekerja untuk saya. Tidak mengembalikan apa pun. Jika saya lakukan '.' itu memberi saya semua file dalam direktori di bawah ini yang sedang saya kerjakan.

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

Kembalikan apa pun dengan '.' sebagai gantinya saya mendapatkan daftar semua file 'besar' di direktori saya serta direktori rootfiles / tempat saya menyimpan yang lama.

Melanjutkan. Ini bekerja.

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

Tampaknya /dev berarti direktori yang menarik. Tetapi ./dibutuhkan, bukan hanya .. Kebutuhan akan hal /itu tidak jelas bahkan setelah saya menemukan apa /devartinya lebih atau kurang.

Saya tidak bisa menanggapi sebagai komentar karena saya tidak punya 'reputasi'.

Athur Snyder
sumber
1
Anda mendapatkan reputasi dengan memberikan jawaban yang baik. Silakan baca stackoverflow.com/conduct
aifrim
Ada alasan mengapa Anda tidak diizinkan untuk berkomentar dan itu tidak memberi Anda izin untuk memberikan komentar di sini di bagian Jawaban. Silakan hapus ini.
Rob