Saya mencoba untuk menemukan semua file dari jenis tertentu yang tersebar di subdirektori, dan untuk keperluan saya, saya hanya perlu nama file. Saya mencoba menghapus komponen jalur melalui basename
, tetapi tidak berhasil dengan xargs
:
$ find . -name '*.deb' -print | xargs basename
basename: extra operand `./pool/main/a/aalib/libaa1_1.4p5-37+b1_i386.deb'
Try `basename --help' for more information.
Saya mendapatkan hal yang sama (kesalahan yang persis sama) dengan salah satu dari variasi ini:
$ find . -name '*.deb' -print0 | xargs -0 basename
$ find . -name '*.deb' -print | xargs basename {}
Ini, di sisi lain, berfungsi seperti yang diharapkan:
$ find . -name '*.deb' -exec basename {} \;
foo
bar
baz
Ini terjadi pada Cygwin dan Debian 5.0.3 yang terbaru. Diagnosis saya adalah xargs karena suatu alasan melewatkan dua jalur input ke nama dasar, tetapi mengapa? Apa yang terjadi di sini?
sumber
xargs
adalah bahwa ia membuat daftar argumen dan memberi makan masing-masing ke perintah yang datang setelah? kalau tidak, apa bedanya itufind . -name '*.deb' | basename
?-a
opsi: "mendukung banyak argumen dan memperlakukan masing-masing sebagai nama".xargs
mengkonversistdin
ke perintah argumen. Di satu sisi, itu kebalikan dariecho
, yang mengubah argumennya menjadistdout
. Perbedaan antarafind ... | xargs -n1 basename
ataufind ... | xargs basename -a
danfind ... | basename
bahwa kedua mantan akan bekerja dengan implementasi daribasename
pengabaian itustdin
.Coba ini:
sumber
find
perintah, jadi saya hanya menggunakannya untuk mencari dan mendaftar file, dan saya menggunakan xargs untuk yang lainnya.basename hanya menerima satu argumen. Menggunakan
-exec
berfungsi dengan baik karena masing{}
- masing diganti dengan nama file saat ini sedang diproses, dan perintah dijalankan sekali per file yang cocok , alih-alih mencoba mengirim semua argumen ke nama file dalam sekali jalan.sumber
xargs
dapat dipaksa untuk hanya melewati satu argumen juga ...find . -name '*.deb' -print | xargs -n1 basename
Ini berfungsi, namun jawaban yang diterima menggunakan
find
dengan cara yang lebih tepat. Saya menemukan pertanyaan ini mencarixargs basename
masalah karena saya menggunakan perintah lain untuk mendapatkan daftar lokasi file. The-n1
bendera untukxargs
adalah jawaban utama bagi saya.sumber