Bagaimana cara menghapus lead "./" di unix "find"?


144
find . -type f -print

mencetak

./file1
./file2
./file3

Cara apapun untuk mencetaknya

file1
file2
file3

?


1
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/.\//}
masterxilo

Jawaban:


40

Jika mereka hanya ada di direktori saat ini

find * -type f -print

Itukah yang kamu inginkan?


22
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.


19
+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;)
blockloop

60

Gunakan sed

find . | sed "s|^\./||"

2
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|^\./||' <<< '{}'" \;
xenithorb

11

itu bisa lebih pendek

find * -type f

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:

find . -type f -execdir printf '%s\n' {} + 

1
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:

find -type f | cut -c3-

Penjelasan lebih lanjut dapat ditemukan di sini


1

Cara lain untuk menghapus ./

find * -type d -maxdepth 0

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.
David Buck
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.