Saya menggunakan find ke semua file dalam direktori, jadi saya mendapatkan daftar path. Namun, saya hanya perlu nama file. yaitu saya dapatkan ./dir1/dir2/file.txt
dan saya ingin mendapatkannyafile.txt
266
Di GNU find
Anda dapat menggunakan -printf
parameter untuk itu, misalnya:
find /dir1 -type f -printf "%f\n"
-o
memiliki prioritas lebih rendah daripada yang tersirat-a
, sehingga Anda akan sering ingin mengelompokkan-o
argumen Anda )Jika temuan Anda tidak memiliki opsi -printf, Anda juga dapat menggunakan nama samaran:
sumber
... {} ';'
Gunakan
-execdir
yang secara otomatis menyimpan file saat ini{}
, misalnya:Anda juga dapat menggunakan
$PWD
sebagai gantinya.
(pada beberapa sistem itu tidak akan menghasilkan titik ekstra di depan).Jika Anda masih mendapat titik tambahan, Anda juga dapat menjalankan:
Saat digunakan
+
sebagai pengganti;
, kemudian{}
diganti dengan sebanyak mungkin nama path untuk setiap pemanggilan utilitas. Dengan kata lain, itu akan mencetak semua nama file dalam satu baris.sumber
./filename
bukanfilename
. Tergantung pada kebutuhan Anda, mungkin atau mungkin tidak baik-baik saja.$PWD
bukan.
.Jika Anda menggunakan GNU find
Atau Anda dapat menggunakan bahasa pemrograman seperti Ruby (1.9+)
Jika Anda suka solusi bash (setidaknya 4)
sumber
Jika Anda ingin menjalankan beberapa tindakan terhadap nama file saja, menggunakan
basename
bisa jadi sulit.Sebagai contoh ini:
hanya akan mengulang nama dasar
/my/found/path
. Bukan yang kita inginkan jika kita ingin mengeksekusi pada nama file.Tetapi Anda bisa kemudian
xargs
output. misalnya untuk membunuh file dalam direktori berdasarkan nama di direktori lain:sumber
find ~/clang+llvm-3.3/bin/ -type f -exec basename {} \;
Pada mac (BSD
find
) gunakan:sumber
-exec
dan-execdir
lambat,xargs
adalah raja.xargs
Paralelisme juga membantu.Lucunya saya tidak bisa menjelaskan kasus terakhir
xargs
tanpa-n1
. Ini memberikan hasil yang benar dan tercepat¯\_(ツ)_/¯
(
basename
hanya membutuhkan 1 argumen jalan tetapixargs
akan mengirim semuanya (sebenarnya 5000) tanpa-n1
. Tidak berfungsi di linux dan openbsd, hanya macOS ...)Beberapa angka yang lebih besar dari sistem linux untuk melihat bagaimana
-execdir
membantu, tetapi masih jauh lebih lambat daripada paralelxargs
:sumber
find
adalah-execdir
yang menjadi tercepat karena menciptakan proses baru adalah operasi yang relatif mahal.Jujur
basename
dandirname
solusinya lebih mudah, tetapi Anda juga dapat memeriksanya:atau
atau
sumber
Seperti yang telah ditunjukkan orang lain, Anda dapat menggabungkan
find
danbasename
, tetapi secara defaultbasename
program hanya akan beroperasi pada satu jalur pada satu waktu, sehingga yang dapat dieksekusi harus diluncurkan satu kali untuk setiap jalur (menggunakan salah satufind ... -exec
ataufind ... | xargs -n 1
), yang mungkin berpotensi lambat.Jika Anda menggunakan
-a
opsi aktifbasename
, maka ia dapat menerima beberapa nama file dalam satu pemanggilan tunggal, yang berarti bahwa Anda kemudian dapat menggunakanxargs
tanpa-n 1
, untuk mengelompokkan jalur bersama menjadi jumlah pemanggilan yang jauh lebih kecilbasename
, yang seharusnya lebih efisien.Contoh:
Di sini saya telah menyertakan
-print0
dan-0
(yang harus digunakan bersama-sama), untuk mengatasi spasi putih di dalam nama file dan direktori.Berikut ini adalah perbandingan waktu, antara versi
xargs basename -a
danxargs -n1 basename
. (Demi perbandingan suka-dengan-suka, timing yang dilaporkan di sini adalah setelah dummy run awal, sehingga keduanya dilakukan setelah file metadata telah disalin ke cache I / O.) Saya telah mengirim output kecksum
dalam kedua kasus, hanya untuk menunjukkan bahwa output tidak tergantung pada metode yang digunakan.Seperti yang Anda lihat, ini sebenarnya jauh lebih cepat untuk menghindari peluncuran
basename
setiap saat.sumber
basename
akan menerima beberapa nama file tanpa memerlukan argumen baris perintah tambahan. Penggunaan di-a
sini adalah di Linux. (basename --version
Memberitahu sayabasename (GNU coreutils) 8.28
.)Saya telah menemukan solusi (pada halaman makandracard), yang hanya memberikan nama file terbaru:
(Terima kasih kepada Arne Hartherz)
Saya menggunakannya untuk
cp
:sumber