Temukan file di linux dan kecualikan direktori tertentu

14

Saya menemukan yang terlihat seperti ini:

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

Saya ingin menambahkan untuk mengecualikan direktori yang disebut "test" dalam menemukan tetapi saya tidak bisa menemukan cara menambahkan "-type d" entah bagaimana. Bagaimana saya bisa melakukan itu?

Terima kasih!

Asken
sumber

Jawaban:

22

Anda dapat menggunakan -pathopsi untuk menemukan dan menggabungkannya dengan -notoperator.

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

Harap perhatikan dua hal

  • -path harus menjadi argumen pertama
  • polanya cocok dengan seluruh nama file, jadi -path testtidak akan cocok dengan apa pun, selamanya

Ngomong-ngomong, saya tidak yakin mengapa Anda menggunakan tanda kurung, itu tidak membuat perbedaan. Ini hanya digunakan untuk diutamakan, untuk konstruksi seperti ! \( -name '*bla*' -name '*foo*' \)(yaitu, tidak menemukan hal-hal yang memiliki keduanya bladan foo).

Penyempurnaan lebih lanjut: Anda tidak perlu menggunakan bash loop, Anda cukup melakukannya

find . ... -exec cat {} \; -exec echo \;

di mana ... adalah argumen lain untuk find.

Januari
sumber
2
find / -path ./test -prune -o ...

Ganti nama ./testagar sesuai dengan lokasi direktori pengujian Anda.

Charles Clavadetscher
sumber
2
Dalam hal ini, jangan lupa tambahkan aksi -print (karena -print bukan aksi default) setelah opsi -o
Bill Zhao
1

Anda dapat mencoba dengan grep seperti ini (folder di sini bernama test_folder):

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

atau jika temuan Anda mengembalikan jalur relatif:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

atau jika Anda ingin semua folder yang memiliki nama yang sama tetapi dengan jalur yang berbeda

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

Salam Hormat,

Antoine Rodriguez
sumber
1

Untuk memperluas apa yang saya pikir @CharlesClavadetscherterjadi dengan jawabannya. Jika Anda menghilangkan jalur dengan -not -path ... findakan terus menuruni jalur. Sebaliknya, menggunakan -pruneakan menghentikannya turun lebih jauh ke jalan yang dihilangkan, membuatnya lebih cepat. Jadi Anda bisa melakukan sesuatu seperti

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

sumber
0

Saya menggunakan "not wholename" ketika saya hanya mencari file. -nama menguji nama file yang sebenarnya, tetapi -wholename menguji path lengkap. Jadi menambahkan abaikan uji untuk pertanyaan di atas:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
andrew lorien
sumber