Ls komutumu nasıl değiştirebilirim?


12

Yazdığımda ls, normal listeyi alıyorum ya da yazdığımda ls -laher şeyi içeren bir ayrıntı sürümü alıyorum ...

Ama düzeninden nefret ediyorum, lskullanımımın çoğu için sadece sezgisel değil.

Değiştirebileceğim bir yol var mı (sorce kodunu değiştirmeden lsbash betikleri tamam) ancak lsgörüntü yerine

-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename0
-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename1
-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename2
drwx------ 13 user group 123546 2011-01-01 11:11 directory0
-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename3
drwx------ 13 user group 123546 2011-01-01 11:11 directory1

Daha fazla gibi bir liste alabilirsiniz:

DIRS
directory0 1293880260 700 user:group
directory1 1293880260 700 user:group

FILES
filename0 1293880260 751 user:group
filename1 1293880260 755 user:group
filename2 1293880260 777 user:group
filename3 1293880260 705 user:group

Ya da başka bir varyasyon.

Bu arada, bayrakları ve diğer seçenekleri kullanma yeteneğini koruyarak.

Yanıtlar:


15

~/bin/lsGeçersiz kılması gereken bir bash betiği yazabilirsiniz /bin/ls. kaçmayı unutma chmod +x ~/bin/ls.

Az önce bunu başarmak istediğiniz şeylerin çoğunu yapıyor gibi görünüyor (ekstra argümanları iletmek dahil)

#!/bin/bash

DIRS="`/bin/ls --color=auto -l $@ | grep ^d`"
FILES="`/bin/ls --color=auto -l $@ | grep ^\-`"

if [ "$DIRS" ]
then
    echo "DIRECTORIES"
    echo -e "$DIRS\

"
fi

if [ "$FILES" ]
then
    echo "FILES"
    echo "$FILES\

"
fi

Birisi bunu biraz düzenlemek veya çıktı biçimlendirmesini iyileştirmek isteyebilir, ama işte gidiyorsunuz. Seninle ne istersen yaparsın.

Ve işte bazı gerçek örnek çıktılar:

ls
DIRECTORIES
drwxr-xr-x 4 oli oli     4096 2010-12-16 15:40 markitup
drwxr-xr-x 7 oli oli     4096 2011-01-16 16:58 media
drwxr-xr-x 3 oli oli     4096 2010-12-16 15:41 post
drwxr-xr-x 9 oli oli     4096 2010-09-16 05:23 templates

FILES
-rw-r--r-- 1 oli oli  5361664 2010-09-06 16:32 db.db
-rw-r--r-- 1 oli oli        0 2008-12-11 09:22 __init__.py
-rwxr-xr-x 1 oli oli      542 2008-12-11 09:22 manage.py
-rw-r--r-- 1 oli oli       13 2010-03-23 18:14 settingsdev.py
-rw-r--r-- 1 oli oli     2642 2010-12-16 15:40 settings.py
-rw-r--r-- 1 oli oli     1818 2010-12-16 15:40 urls.py
-rw-r--r-- 1 oli oli      432 2010-06-22 20:54 views.py

Ve argümanlarla:

ls -a
DIRECTORIES
drwxr-xr-x  8 oli oli     4096 2011-01-12 00:46 .
drwxr-xr-x 19 oli oli     4096 2011-04-13 17:24 ..
drwxr-xr-x  6 oli oli     4096 2010-02-03 13:50 .bzr
drwxr-xr-x  4 oli oli     4096 2010-12-16 15:40 markitup
drwxr-xr-x  7 oli oli     4096 2011-01-16 16:58 media
drwxr-xr-x  3 oli oli     4096 2010-12-16 15:41 post
drwxr-xr-x  9 oli oli     4096 2010-09-16 05:23 templates

FILES
-rw-r--r--  1 oli oli       65 2010-03-27 07:58 .bzrignore
-rw-r--r--  1 oli oli  5361664 2010-09-06 16:32 db.db
-rw-r--r--  1 oli oli        0 2008-12-11 09:22 __init__.py
-rwxr-xr-x  1 oli oli      542 2008-12-11 09:22 manage.py
-rw-r--r--  1 oli oli       13 2010-03-23 18:14 settingsdev.py
-rw-r--r--  1 oli oli     2642 2010-12-16 15:40 settings.py
-rw-r--r--  1 oli oli     1818 2010-12-16 15:40 urls.py
-rw-r--r--  1 oli oli      432 2010-06-22 20:54 views.py

7

İşte benim hızlı jab.

$ function lss { ls -l --group-directories-first --time-style +%s $@ | grep -v '^total' | awk 'BEGIN {print("DIRS")} {if (f!=1 && $1 ~ /^-/) {print "\nFILES"; f=1}; printf("%s\t%s %s %s:%s\n", $7, $6, $1, $3, $4);}'; }
$ alias ls='lss'
$ ls
DIRS
directory0  1305901476 drwxr-xr-x ak:ak
directory1  1305901476 drwxr-xr-x ak:ak

FILES
filename0   1305901484 -rw-r--r-- ak:ak
filename1   1305901484 -rw-r--r-- ak:ak
filename2   1305901484 -rw-r--r-- ak:ak
filename3   1305901484 -rw-r--r-- ak:ak

Bu yaklaşımın yararı, çoklu dizin geçişleri gerektirmemesi ve çıktıyı hazır olarak yazdırmasıdır. Bunu touch filename{0..10000}bir test olarak çalıştırmayı deneyin .

Kalıcı hale getirmek için functionve aliasçizgilerini bırakın ~/.bashrc.

Oli'den Kıyaslama:

oli@bert:~/Desktop$ mkdir test
oli@bert:~/Desktop$ cd test
oli@bert:~/Desktop/test$ mkdir dir{0..100000}
oli@bert:~/Desktop/test$ touch filename{0..100000}

oli@bert:~/Desktop/test$ time /bin/ls>/dev/null

real    0m0.975s
user    0m0.860s
sys         0m0.110s

oli@bert:~/Desktop/test$ time ls --group-directories-first -l >/dev/null

real    0m1.810s
user    0m1.210s
sys         0m0.580s


oli@bert:~/Desktop/test$ time lss>/dev/null  # ændrük's method

real    0m2.035s
user    0m1.810s
sys         0m0.780s

oli@bert:~/Desktop/test$ time ~/bin/ls>/dev/null  # Oli's method

real    0m5.496s
user    0m4.290s
sys         0m1.460s

4
Yayınınıza bir miktar karşılaştırma eklendi (daha önce de belirtildiği gibi). Evet, 100.000'den fazla dizin ve 100.000 dosya, sizinki yarıdan daha az zaman alıyor. Ancak lskendi başına hala çok daha hızlı. Her iki durumda da, bu bir uç durum. Çoğu insan asla böyle büyük dizin listelerine sahip değildir. Normal insanlar için gözlemlenebilir çok az fark vardır. Güzel awking olsa. +1
Oli

4

ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

Gösterir ... dizinler, normal dosyalar, o sırayla bağlantılar.

Bir takma ad yap ve gitmeye hazırsın.

Başka bir yöntem bulundu:

ls -l --color -h --group-directories-first

Bu önce dizinleri yapar ve dosya adlarını renklendirir.

In ~/.bashrcsize şöyle bu komut için bir takma ad oluşturabilirsiniz:

alias ls1='ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

Örnek çıktı:

drwxr-xr-x 5 96 2011-05-20 13:41.
drwxr-xr-x 16 xxxx uuuu 96 2010-03-05 12:34 ..
drwx ------ 2 xxxx uuuu 96 2009-02-13 14:31 .ssh
drwxrwxr-x 2 xxxx uuuu 96 2009-12-03 13:49 .xxx
drwxrwxr-x 5 xxxx uuuu 96 2010-12-06 15:51 xxxxxx
-rw ------- 1 xxxx uuuu 05 2011-05-20 14:12 .bash_history
-rw-r - r-- 1 xxxx uuuu 20 2009-02-12 09:33 .bash_logout
-rw-r - r-- 1 xxxx uuuu 29 2009-03-06 11:47 .bashrc
-rw-r - r-- 1 xxxx uuuu 80 2011-05-20 13:42 fff
-rw-rw-r-- 1 xxxx uuuu 03 2011-05-18 10:21 dffff

veya ikincisi için: alias ls2=ls -l --color -h --group-directories-first

Örnek çıktı:

drwxrwxr-x 5 xxxx uuuu 4.0K 2010-12-06 15:51 ddddd
-rw-r - r-- 1 xxxx uuuu 339M 2011-05-20 13:42 sssss
-rw-rw-r-- 1 xxxx uuuu 4.6M 2011-05-18 10:21 dxsssss
-rwxrwxr-x 1 xxxx uuuu 68 2011-02-22 15:55 5555
-rwxr - r-- 1 xxxx uuuu 20K 2010-12-06 16:11 ffff
ddddd başka bir renkte olacak. eklemek -aiçin gizli dosyaları da ekleyin .

ve bunu yapmak için ls1 ve ls2 komutunu yarattınız.


2

.Bashrc içinde takma ad ayarlarını genişletmek, daha uygun 'ls' komutlarını almanın tercih edilen yoludur. Özellikle 'lf' yi seviyorum ('ağaç' kurulumunu gerektirir).

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias lf='tree -d -L 1'

2

Unix sistemlerindeki en güçlü araçlardan biri findkomuttur. lsÇıkışı -lsbayrakla taklit etmek ve bayraklı dosya türüne göre aramak için kullanabiliriz -type. Böylece, feryat gördüğünüz şey tamamen aynı komuttur, ancak findiki farklı tür aramakla. printfifadeleri yalnızca önce listelenmesini istediğinizi belirtir.

printf "****DIRS****\n"; find . -maxdepth 1 -type d -ls; echo "****FILES****"; find . -maxdepth 1 -type f -ls

İşte örnek çıktı:

CURRENT DIR:[/home/xieerqi/bin]
$ printf "****DIRS****"; find . -maxdepth 1 -type d -ls; echo "****FILES****"; find . -maxdepth 1 -type f -ls                                 
****DIRS****
5795516    4 drwxrwxr-x   8 xieerqi  xieerqi      4096 Aug 19 16:25 .
5795514    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./c
5795511    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./python
5795153    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:41 ./perl
5795532    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./random
5795531    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./sh
5795141    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./cs2
****FILES****
5795538    4 -rw-rw-r--   1 xieerqi  xieerqi       178 Aug 19 16:25 ./somefile.txt
5795539    4 -rw-rw-r--   1 xieerqi  xieerqi       219 Aug 19 16:26 ./somefile2.txt

Örneğin, önde gelen noktalı gizli dosyalar da dahil olmak üzere tüm dosyaları findlistelediğine dikkat edin ..bashrc

Şimdi, erişim bu komut kolaylaştırmak gözlerinde o bir takma ad oluşturun .bashrc. Benimkini böyle yaptım

alias ls2='printf "****DIRS****\n"; find . -maxdepth 1 -type d -ls; echo "****FILES****"; find . -maxdepth 1 -type f -ls '

Kaynak bashrc ile . .bashrcveya çıkış ve terminal girin. Takma adınız artık istediğiniz zaman kullanıma hazırdır.


En güçlü araç? Aslında. :)
AB

1

ls çok fazla çıktı özelleştirmesini desteklemiyor.

kullanım

 ls --group-directories-first -l

sadece önce dirs almak için.

Göz at limuzinin destekleri daha çıktı özelleştirme (ama her seçenekleri desteklemediği ls alternatif için (varsayılan olarak yüklenmez) ls)


0

En son lsmodum ~/bin:

#!/bin/bash
ACCOUNT_ID=$UID
#
#SET ACCOUNT_NAME
ACCOUNT_NAME=$( cat /etc/passwd | grep $ACCOUNT_ID | cut -d: -f1 );

ls -l -F --color -h --group-directories-first $1 |\
    sed "s/$ACCOUNT_NAME/\$USER/g" | ack --passthru --color \\\$USER ;

PS onu adlandırmak zorunda kaldı ~/bin/mylsya da sisteme asla ulaşamayan döngü içinde asacaktır ls.

Örnek Çıktı:

$ sudo mkdir -vp /temp/Nother_DIR | tee -a /tmp/record
mkdir: created directory `/temp'
mkdir: created directory `/temp/Nother_DIR'
$ sudo chown -vR $USER:$USER /temp | f | tee -a /tmp/record
changed ownership of `/temp/Nother_DIR' to $USER:$USER
changed ownership of `/temp' to $USER:$USER
$ cd /temp
$ touch a b c d
$ ln -sv d e | tee -a /tmp/record
`e' -> `d'
$ ln -sv e f | tee -a /tmp/record
`f' -> `e'
$ myls | tee -a /tmp/record
total 4.0K
drwxr-xr-x 2 $USER $USER 4.0K Sep 19 00:46 Nother_DIR
-rw-r--r-- 1 $USER $USER    0 Sep 19 00:46 a
-rw-r--r-- 1 $USER $USER    0 Sep 19 00:46 b
-rw-r--r-- 1 $USER $USER    0 Sep 19 00:46 c
-rw-r--r-- 1 $USER $USER    0 Sep 19 00:46 d
lrwxrwxrwx 1 $USER $USER    1 Sep 19 00:46 e -> d
lrwxrwxrwx 1 $USER $USER    1 Sep 19 00:46 f -> e

-1

~ / Bin'deki en son ls modum:

#!/bin/bash
ACCOUNT_ID=$UID
# 
#SET ACCOUNT_NAME
ACCOUNT_NAME=$( cat /etc/passwd | grep $ACCOUNT_ID | cut -d: -f1 );  

ls -l -F --color -h --group-directories-first $1 |\  
    sed "s/$ACCOUNT_NAME/\$USER/g" | ack --passthru --color \\\$USER ;  

Yazının biçimi için üzgünüm. Kopyala / yapıştır ile kullanılabilir hale getirmeye çalıştı, ancak belki de gitmeyin. Şerefe!
PS ~ / bin / myls olarak adlandırmak zorunda kaldı ya da sistemin ls asla ulaşamayan döngü içinde asacaktır.


ACCOUNT_NAME="$(getent passwd $UID | cut -d: -f1)"ve/bin/ls -l -F ...
waltinator
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.