Saya ingin menggunakan find
daftar semua file dan direktori secara rekursif dalam root yang diberikan untuk cpio
operasi. Namun, saya tidak ingin direktori root itu sendiri muncul di jalur. Misalnya, saya saat ini mendapatkan:
$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2
Tapi, saya ingin mendapatkannya
file1
dir1
dir1/file2
(perhatikan root juga tidak dalam output yang saya inginkan, tapi itu mudah untuk dihilangkan dengan tail
).
Saya menggunakan OS X, dan saya lebih suka tidak menginstal alat tambahan (mis. Temukan GNU) jika memungkinkan, karena saya ingin berbagi skrip yang saya tulis dengan pengguna OS X lainnya.
Saya sadar ini bisa dilakukan dengan cut
memotong daftar root, tapi itu sepertinya solusi yang kurang optimal. Apakah ada solusi yang lebih baik?
find diskimg/* | cut -d '/' -f2-
Jawaban:
Jika apa yang Anda coba lakukan tidak terlalu rumit, Anda dapat melakukannya dengan:
Atau
cut
:sumber
find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'
(perhatikan saya menambahkan juga '-e', dan^
praktik yang baik (tidak perlu di sini, karena Anda yakin setiap baris akan memiliki ini ... tetapi masih praktik yang baik) , dan menyimpan beberapa cpu;))find diskimg | sed -e 's|^diskimg/*||'
('/ *' akan cocok dengan sejumlah '/', bahkan 0)cut
perintah lebih bersih daripada yang saya digunakan; Saya suka itu. (sed
Solusinya juga bagus, tapi pengulangannyadiskimg/
sedikit disayangkan).cd
ke dalam direktori terlebih dahulu:Setelah selesai, Anda akan kembali ke direktori root Anda.
File Anda akan diawali dengan ./ dalam hal ini; satu-satunya cara saya melihat sekeliling yang akan menggunakan
cut
:Gunakan subkulit untuk menghindari mengubah direktori shell Anda saat ini (ini tidak perlu jika Anda memipipkan output karena sisi kiri pipa sudah berjalan dalam subkulit).
sumber
(cd diskimg && find . ; )
. Dengan caracd diskimg && find .
itu dilakukan dalam subshell: ketika subshell itu keluar Anda kembali ke shell Anda sendiri, di direktori apa pun Anda berada.find *
adalah cara lain di sekitar awalan yang tidak bergunaLain, lebih kompleks tetapi hanya menggunakan pendekatan find dari jawaban saya yang lain:
sumber
find
dukunganprintf
.find
dukungan GNU-printf
, sementara banyak BSDfind
telah menyalin beberapa fitur GNUfind
, belum ada yang menyalin-printf
(AFAIK).%P
untuk path relatif adalah apa yang saya butuhkan.Gunakan
realpath
utilitas:sumber
--relative-to
.