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

144
find . -type f -print

mencetak

./file1
./file2
./file3

Cara apapun untuk mencetaknya

file1
file2
file3

?

roti yesus
sumber
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?

Tim Green
sumber
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.

Ilia K.
sumber
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|^\./||"
Lie Ryan
sumber
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
anjing hantu74
sumber
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' {} + 
anubhava.dll
sumber
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

banjoAtix
sumber
1

Cara lain untuk menghapus ./

find * -type d -maxdepth 0
Valheru
sumber
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