Apakah mungkin untuk output find … -exec ls -ls ;
diurutkan secara alpabetis, dengan nama file?
Ini adalah perintah cron saya:
find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;
Perintah ini berfungsi baik, sebagian besar. Tetapi hasilnya tidak diurutkan dalam urutan yang berarti. Akan sangat membantu jika mereka akan disortir berdasarkan bidang nama file.
ls -ls **/*(.)
ls
akan menyortir.Jawaban:
Saya berasumsi bahwa nama file Anda tidak mengandung baris baru.
Menggunakan
+
alih-alih;
mengakhiri-exec
tindakan membuatnya lebih cepat dengan menumpuk doals
. Anda dapat mengurutkan berdasarkan piping melaluisort
perintah; katakan untuk mulai menyortir di bidang 10 (9 yang pertama adalah metadata: blok, izin, jumlah tautan, pengguna, grup, ukuran, dan 3 bidang tanggal / waktu). Opsi-n
memberi tahuls
untuk menggunakan nilai numerik untuk pengguna dan grup, yang menghindari risiko nama pengguna atau grup yang mengandung spasi putih.Atau, dengan zsh, Anda dapat pergi tanpa asumsi pada nama apa pun dengan menggunakan glob qualifiers untuk mengumpulkan dan mengurutkan file dan
zargs
menjalankanls
beberapa kali jika baris perintah terlalu panjang. Anda memang membutuhkan GNUls
(khususnya-f
pilihannya) untuk menghindari pengurutan ulang denganls
(pendekatan lain adalah meniruls
dengan zshzstat
).sumber
Mengapa tidak mem-pipe hasil find melalui sort dan kemudian mengeksekusi ls untuk masing-masing baris?
sumber
POSIX mengatakan ini tentang tanggal di
ls
-l
daftar ong:Mempertimbangkan hal ini, dan memastikan bahwa jika ada baris baru dalam nama file, mereka diblender dengan benar dengan opsi yang juga ditentukan POSIX
ls -q
, relatif mudah untuk menyiapkan regex untukls
hasil tanpafind
sama sekali:grep
untuk itu dan Anda hanya akan mengembalikan garis yang berisi string yang mewakili tanggal hari ini atau kemarin. Perintah berikut menambah sedikit itu:ls
opsi terdiri dari:-a
kembalikan semua file dalam direktori - termasuk yang dimulai dengan a.dot
-l
daftar panjang-R
daftar semua direktori anak secara rekursif-c
menampilkan waktu modifikasi daripada waktu akses-q
mengembalikan shell glob?
daripada karakter yang tidak dapat dicetak atau\t
ab dalam nama fileHasil tersebut diteruskan ke
|pipe
filesed
yang hanya cocok:-
(d
dengan kata lain - bukan untuk direktori) yang juga berisidate
.Outputnya terlihat seperti ini:
Ya, itu bahkan bekerja dengan
LS_COLORS
- yang mungkin merupakan prioritas rendah untuk Andacron
tentu saja, tetapi, hei pilihan Anda terbuka.Bagaimanapun, ini menawarkan beberapa keuntungan signifikan dibandingkan beberapa solusi lain yang mungkin.
Pertama-tama
find
+ls
melibatkan banyak pemanggilan - ini hanya melibatkan satuls
proses tunggal , dan inilah mengapa ia mampu mengurutkan segala sesuatu dengan andal - yang dilakukan secara default - dansort
juga dibuat tambahan.Solusi apa pun yang melibatkan
find
dansort
danls
cukup banyak melakukan semua pekerjaan dua kali.ls
danfind
keduanya akan menyelesaikan setiap pathname danstat
setiap file.ls
dansort
keduanya akan mengurutkan semua hasil. Mungkin lebih baik menggunakan satu sajals
.Maka tentu saja ada
date
dansed
sebagian dari jawaban ini. Yang penting untuk dicatat tentang itu adalah Anda melakukan bagian yang sulit dan mendapatkan regex pertama - dan hanya sekali - dan setelah itu Anda hanya memangkas satu daftar hasil daripada mengatakan, dapatkan hasil, dapatkan hasil, hasilkan hasil, hasilkan sortir dan hasil sortir.Ini tidak melanggar nama file yang mengandung baris baru, karena solusi lain mungkin akan melakukannya. Solusi ini memang memiliki peringatan sendiri - yang saya jelaskan selanjutnya - tetapi mereka kecil dan mudah ditangani. Menurut pendapat saya, ini adalah solusi paling kuat di sini.
Ada dua kasus di mana perintah di atas dapat menyebabkan masalah. Yang pertama melibatkan
?
gumpalan dalam nama file - sementara itu sudah merupakan solusi yang lebih kuat daripada yang ditawarkan di sini, dan kemungkinan bahwa Anda akan menemukan?
sama sekali cukup kecil sendiri, ada kemungkinan menyelesaikan gumpalan tersebut dapat cocok dengan lebih dari satu nama file. Silakan lihat ini untuk informasi lebih lanjut tentang hal ini.Kemungkinan lain melibatkan false positive - misalnya jika Anda memiliki nama file yang benar-benar cocok dengan
date
string yang kami carigrep
tetapi itu tidak benar-benar dimodifikasi pada salah satu hari itu. Saya tidak mengandalkan itu menjadi masalah, tetapi, jika itu, tanyakan tentang hal itu dan saya mungkin dapat membantu Anda membuat regex lebih spesifik untuk menangani hal ini.sumber
Anda benar-benar dapat menggunakan kombinasi find, xargs dan ls.
Berikut ini contoh perintah:
find . -type f -print0 | xargs -0 ls -lt
find
akan secara rekursif mencari semua file di bawah direktori saat ini.ls
perintah dalam satu panggilan tunggal (asalkanfind
mengembalikan kurang dariARG_MAX
file).ls -lt
akan mengurutkan file-file ini berdasarkan waktu dan memformat outputUntuk mengambil sistem
ARG_MAX
Anda, Anda dapat mengetik:sumber
sumber
ls
melakukan penyortiran sendiri, jadi menyalurkan outputfind
melaluisort
tidak berguna. Selanjutnya perintah Anda mangles nama file yang berisi spasi putih (antara lain) dan akan gagal jika ada terlalu banyak nama file.