Tujuan saya tampak sederhana (setidaknya bagi saya). Saya ingin mengambil output ls -l
atau ls -lh
dan memilih hanya satu bidang.
Saya mencari ini sebagai antipeluru mungkin, maksud saya, berasumsi bahwa nama file dapat memiliki jumlah ruang variabel, tidak semua bidang memiliki panjang yang sama, dll.
Poin bonus untuk memiliki skrip yang akan mengambil nama bidang (atau bahkan hanya nomor bidang), dan kemudian mengembalikan konten bidang.
Saya ingin berbalik
ke:
command-line
bash
soando
sumber
sumber
ls
. Thefind
perintah sangat membantu.ls -l --block-size=M
?ls
Perintah ini bukan standar POSIX, jadi skrip yang bergantung padals
dapat merusak sistem yang berbeda atau bahkan seiring waktu. Lihat jawabannya oleh @ormaaj di halaman ini untuk detail lebih lanjut. Salah satu cara untuk melakukan apa yang Anda minta adalah dengan Bash loop. Berikut ini sebuah contoh.for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done
. Tentu saja, alih-alihecho
, Anda akan menggunakan pemrosesan Anda.... | xargs -d '\n' du -m
yang berfungsi dengan baik.-exec
opsifind
.Jangan parse ls . Gunakan GNU
find
. Atau jika portabilitas tidak pentingstat(1)
,.Untuk membaca data selain daftar nama file baris demi baris dan membelah menjadi beberapa bidang, lihat: BashFAQ / 001
Tidak ada metode untuk secara andal membaca daftar nama file yang dibatasi baris baru yang masuk akal dalam sebagian besar keadaan.
sumber
Anda dapat mengambil kolom tertentu di shell seperti:
atau
awk
seperti yang ditunjukkan dalam jawaban @Corey ,cut -c44-45
juga akan berfungsi setelah penyesuaian (karenals
memiliki kolom yang diperbaiki), atau apa pun yang lain, namun masalah utama adalah bahwa itu tidak dapat diandalkan dan antipeluru (mis. pada Unix mungkin$6
, tidak$7
, dan itu perubahan tergantung pada argumen) sehingga tidak ramah mesin karena itu tidak disarankan untuk mengurails
perintah sama sekali.Yang terbaik adalah dengan menggunakan berbagai perintah yang tersedia seperti
find
ataustat
, yang dapat memberikan opsi yang relevan untuk memformat output yang Anda butuhkan. Sebagai contoh:Untuk mengembalikan kolom modifikasi yang hanya beberapa hari, coba contoh ini:
Perlu dicatat bahwa GNU
stat
dapat memiliki opsi yang berbeda untuk BSDstat
, sehingga GNU tidak akan tahan antipeluru pada sistem operasi yang berbeda.sumber
stat
.date
Namun pengaturan salah. Anda harus menambahkan--date=$ymd
, karenadate
dengan sendirinya akan mencetak hari ini, tetapi tujuannya di sini adalah untuk mengubah format tanggal filels -la | cut -c32-33
perintah total kejujuran adalah hanya benar-benar bisa diandalkan, bukan hanya karena perangkap mungkin dengan nama file, tapi hanya karena tergantung pada panjang dan pada file nama pengguna ukuran. Thestat -c "%x" *.*
perintah terlihat ok, tapi dengan menggunakan*.*
Anda restricing hanya untuk nama file yang mengandung titik. Saya kira tujuannya adalah untuk menangkap juga file-file tersembunyi; dalam hal ini Anda harus memungkinkan globbing untuk dotfiles terlebih dahulu dan menggunakan*
bukan*.*
:shopt -s dotglob; stat -c "%x" * | [...]
.--date="$ymd"
kedate
perintah, jika tidak maka akan mencetak hari saat bulan.