temukan tanpa rekursi

246

Apakah mungkin untuk menggunakan findperintah dengan cara tertentu sehingga tidak akan muncul kembali ke dalam sub-direktori? Sebagai contoh,

DirsRoot
  |-->SubDir1
  |    |-OtherFile1
  |-->SubDir2
  |    |-OtherFile2
  |-File1
  |-File2

Dan hasil dari sesuatu seperti find DirsRoot --donotrecuourse -type fhanya akan terjadi File1, File2?

filippo
sumber

Jawaban:

380

Saya pikir Anda akan mendapatkan apa yang Anda inginkan dengan -maxdepth 1opsi, berdasarkan pada struktur perintah Anda saat ini. Jika tidak, Anda dapat mencoba melihat halaman manual untuk find.

Entri yang relevan (demi kenyamanan):

-maxdepth levels
          Descend at most levels (a non-negative integer) levels of direc-
          tories below the command line arguments.   `-maxdepth  0'  means
          only  apply the tests and actions to the command line arguments.

Pilihan Anda pada dasarnya adalah:

find DirsRoot/* -maxdepth 0 -type f #This does not show hidden files

Atau:

find DirsRoot/ -maxdepth 1 -type f #This does show hidden files
eldarerathis
sumber
Untuk contoh OP, saya pikir ini perlu -maxdepth 1?
Paul R
@ Paul R: Sebenarnya, hal seperti itu tergantung pada bagaimana dia ingin menangani file-file tersembunyi, tetapi saya tetap mengubah jawaban saya. Untuk contohnya 1mungkin apa yang dia inginkan.
eldarerathis
1
Bagi saya, -maxdepth 0tidak menampilkan file apa pun tetapi -maxdepth 1berfungsi sebagaimana mestinya, dengan file tersembunyi juga ditampilkan.
Bruce Wayne
1
@BruceWayne perhatikan *di find DirsRoot/* -maxdepth 0 -type f. Jika Anda membiarkannya, itu tidak akan menampilkan file apa pun.
Peta
@membuat, Terima kasih, tapi saya tidak ingat konteks asli di mana saya memiliki masalah ini, haha.
Bruce Wayne
33

Saya yakin Anda sedang mencari -maxdepth 1.

paradoks wafel
sumber
1
Untuk contoh OP, saya pikir ini perlu -maxdepth 1?
Paul R
Ya, jika dia menggunakan perintah persis seperti dalam contohnya maka itu akan 1. Kesalahan saya.
waffle paradox
17

Jika Anda mencari solusi yang sesuai dengan POSIX:

cd DirsRoot && find . -type f -print -o -name . -o -prune

-maxdepth bukan opsi yang sesuai dengan POSIX.

sqr163
sumber
terima kasih atas solusi ini, tetapi tidak bisakah ini disederhanakan find DirsRoot/* -type f -prune?
dokaspar
@dasaspar Pertanyaan yang sangat bagus! (Anda lupa memasukkan "-o" sebelum -prunebtw) Jawabannya adalah tidak, tidak bisa. Untuk memahami sepenuhnya MENGAPA itu tidak dapat disederhanakan, cukup kirimkan set -xperintah sebelum memancarkan find DirsRoot/* -type f -o -prunedan Anda akan segera melihatnya sendiri. Akar penyebabnya adalah keterbatasan ekspansi DirsRoot/*ekspresi shell .
sqr163
tidak bekerja pada centos, masih melakukan rekursi penuh pada output !!!! Perintah yang tepat adalahfind . -name . -o -prune
Reishin
pada Solaris, tetap dengan DirsRoot sebagai jalur yang diinginkan, Anda tidak perlu cd; sebagai gantinya, Anda dapat: menemukan DirsRoot /. -type f -print -o -name. -o -prune
spioter