Mengapa saya berakhir dengan 4 doa alih-alih 3 saat menggunakan find -execdir {} + ini (plus)?

8

Saya membaca di sini bahwa Anda dapat menghitung jumlah doa commandmasuk -exec command {} +dengan menyalurkannya | wc -lke akhir.

Walaupun saya mengerti bahwa -execdirini berbeda, dalam hal itu, untuk setiap sub-direktori yang cocok yang findditemukan, ia menjalankan permintaan dari commandsub-direktori yang terkandung di dalamnya, jika saya memiliki lebih dari satu file yang cocok dengan sub-direktori, seharusnya tidak Apakah saya dapat menemukan jumlah invokasi yang sama dengan jumlah sub-direktori yang cocok, dan bukan jumlah invokasi yang cocok dengan jumlah file yang cocok pada sub-direktori tersebut?

Saya berakhir dengan yang terakhir ketika saya menjalankan yang berikut:

$ find . -name "bob*" -execdir echo {} + | wc -l

Halaman manual untuk execdir command {} +menyatakan bahwa yang pertama harus menjadi kasus:

Seperti -exectindakan, +bentuk perintah -execdirakan membangun baris perintah untuk memproses lebih dari satu file yang cocok, tetapi setiap permintaan yang diberikan commandhanya akan mencantumkan file yang ada di sub-direktori yang sama.


yaitu

Saya mendapatkan:

./file1inDir1
./file2inDir1
./file3InDir2
./file4InDir3

Ketika saya mengharapkan ini, berdasarkan halaman manual:

./file1inDir1 ./file2inDir1
./file3InDir2
./file4InDir3
Leandand00
sumber
Anda tidak dapat menghitung permintaan perintah secara umum seperti itu. Jika perintahnya adalah echodan argumen yang dihasilkan oleh {} +dan Anda tidak memiliki baris baru di nama file Anda (kebanyakan orang tidak) MAKA jumlah baris adalah jumlah doa dan itu berfungsi. Jika perintah dikatakan head -n 999000 /dev/urandomitu salah besar.
dave_thompson_085

Jawaban:

11

Ini adalah masalah kinerja find. Dalam findutilsversi 4.3.4, solusi harus membatasi jumlah argumen yang -execdir ... {} +akan digunakan ke 1. Dalam versi 4.5.9 batas telah dihapus.

Lihat sebuah contoh:

$ mkdir -p dir{1..3}
$ touch dir{1..3}/file1 dir2/file{1..3}
$ find
.
./dir1
./dir1/file1
./dir2
./dir2/file1
./dir2/file2
./dir2/file3
./dir3
./dir3/file1

Dengan -execdir {} +, perintah harus dijalankan 3 kali. Doa kedua harus memiliki 3 argumen.

Dengan find4.4.2:

$ find-4.4.2 . -name "file*" -execdir sh -c 'echo "Executing $@ in $(pwd)"' find-sh {} +
Executing ./file1 in /path/to/dir1
Executing ./file1 in /path/to/dir2
Executing ./file2 in /path/to/dir2
Executing ./file3 in /path/to/dir2
Executing ./file1 in /path/to/dir3

Dengan find4.6.0:

$ find-4.6.0 . -name "file*" -execdir sh -c 'echo "Executing $@ in $(pwd)"' find-sh {} +
Executing ./file1 in /path/to/dir1
Executing ./file1 ./file2 ./file3 in /path/to/dir2
Executing ./file1 in /path/to/dir3
kekacauan
sumber