jika Anda digunakan -exec /path/to/myscript.sh {} di Anda find, -printf '%P\n'itu tidak berfungsi. Sebagai gantinya, saya harus melakukan ./awalan yang mengunyah di dalam skrip dengan:p=${1#"./"}
eigenfield
Jika Anda melakukannya hanya untuk satu file:f=`find . -name migration`; echo ${f/.\//}
Ini akan kehilangan file dengan nama yang dimulai dengan titik.
Sean
2
Buruk, tergantung pada pengaturan shell * mungkin tidak mengevaluasi ke file / direktori "tersembunyi" - yang dimulai dengan titik (.) Coba jalankan perintah ini di direktori home Anda, lalu "temukan -type f" dan lihat perbedaannya .
Ilia K.
36
Perhatian yang lebih relevan adalah bahwa '*' dievaluasi oleh shell. Anda secara efektif memiliki jenis situasi injeksi kode berbahaya. Akan mudah untuk membuat file bernama '--exec rm' dan file lain bernama 'zzzz;'. Selamat tinggal file.
CWF
6
Ini tidak aman. Jika nama file dimulai dengan tanda hubung, itu akan dianggap sebagai opsi untuk menemukan, dan mungkin gagal, atau berpotensi merusak.
Dale Anderson
4
Mengapa -printdibutuhkan? Itu memberikan hasil yang sama tanpa bendera itu.
pengguna13107
249
Temukan hanya file biasa di bawah direktori saat ini, dan cetak tanpa ./awalan " ":
find -type f -printf '%P\n'
Dari man find, deskripsi -printfformat:
% P Nama file dengan nama argumen baris perintah yang ditemukan dihapus.
+1 Solusi bagus jika versi Anda findmendukung -printf(tidak semua mendukung ).
Todd Owen
2
Seperti yang dikatakan Todd, tetapi lebih tepatnya: ini bukan POSIX 7.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
8
Didukung atau tidak, ini pasti lebih aman daripada jawaban yang diterima.
Dale Anderson
10
Anda dapat menggunakan \0alih-alih \njika Anda ingin menyalurkannya ke xargs -0(misalnya jika nama file berisi spasi), misalnyafind -type f -printf '%P\0' | xargs -0 head
seanf
1
@Quanlong, ini berfungsi di macOS jika Anda brew install findutils;)
Ini adalah solusi pilihan saya; ini kompatibel dengan POSIX (bekerja secara praktis di mana saja, bahkan sistem tertanam), sangat singkat, dan tidak mungkin menghasilkan perilaku yang tidak terduga. Ini harus menjadi jawaban yang diterima.
Jody Bruchon
7
Bagaimana ini digabungkan dengan find -exec?
Paul Wintz
find -exec sh -c "echo {} | sed 's|^\./||'" \; atau find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
Lebih baik dengan 2> /dev/nullmengabaikan kesalahan yang dilaporkan ketika perintah dijalankan di direktori kosong.
neevek
4
Karena -printfopsi tidak tersedia di OSX, findberikut adalah satu perintah yang berfungsi di OSX temukan, untuk berjaga-jaga jika seseorang tidak ingin menginstal gnu findmenggunakan brewdll:
Sayangnya ini menghapus seluruh jalur dari setiap file yang ditemukan, termasuk subdirektori menengah, dan hanya mencetak nama file itu sendiri.
PLL
2
Kamu benar. Solusi ini hanya bagus untuk file di direktori saat ini. Untuk file bersarang kita perlu menggunakan:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
anubhava
2
Cara lain untuk mengupas ./adalah dengan menggunakan cutlike:
Meskipun kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan tentang bagaimana dan mengapa ini menyelesaikan masalah akan sangat membantu meningkatkan kualitas posting Anda, dan mungkin menghasilkan lebih banyak suara. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, bukan hanya orang yang bertanya sekarang. Harap edit jawaban Anda untuk menambahkan penjelasan dan memberikan indikasi batasan dan asumsi apa yang berlaku.
-exec /path/to/myscript.sh {}
di Andafind
,-printf '%P\n'
itu tidak berfungsi. Sebagai gantinya, saya harus melakukan./
awalan yang mengunyah di dalam skrip dengan:p=${1#"./"}
f=`find . -name migration`; echo ${f/.\//}
Jawaban:
Jika mereka hanya ada di direktori saat ini
find * -type f -print
Itukah yang kamu inginkan?
sumber
-print
dibutuhkan? Itu memberikan hasil yang sama tanpa bendera itu.Temukan hanya file biasa di bawah direktori saat ini, dan cetak tanpa
./
awalan " ":Dari man find, deskripsi
-printf
format:sumber
find
mendukung-printf
(tidak semua mendukung ).\0
alih-alih\n
jika Anda ingin menyalurkannya kexargs -0
(misalnya jika nama file berisi spasi), misalnyafind -type f -printf '%P\0' | xargs -0 head
brew install findutils
;)Gunakan sed
sumber
find -exec
?find -exec sh -c "echo {} | sed 's|^\./||'" \;
ataufind -exec sh -c "sed 's|^\./||' <<< '{}'" \;
itu bisa lebih pendek
sumber
2> /dev/null
mengabaikan kesalahan yang dilaporkan ketika perintah dijalankan di direktori kosong.Karena
-printf
opsi tidak tersedia di OSX,find
berikut adalah satu perintah yang berfungsi di OSX temukan, untuk berjaga-jaga jika seseorang tidak ingin menginstalgnu find
menggunakanbrew
dll:sumber
find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
Cara lain untuk mengupas
./
adalah dengan menggunakancut
like:Penjelasan lebih lanjut dapat ditemukan di sini
sumber
Cara lain untuk menghapus ./
sumber