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?

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

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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.