`ls` 명령을 어떻게 수정합니까?


12

입력 ls하면 일반 목록이 표시되거나 입력 ls -la하면 모든 정보가 포함 된 세부 정보 버전이 표시됩니다.

하지만의 레이아웃이 싫습니다 ls. 대부분의 사용에는 직관적이지 않습니다.

내가 수정할 수있는 방법이 있습니까 (대리 코드를 변경하지 않고 lsbash 스크립트는 괜찮습니다) ls대신 대신 표시됩니다

-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

다음과 같은 목록을 더 얻을 수 있습니다.

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

또는 다른 변형.

한편, 플래그 및 기타 옵션을 사용하는 기능을 보존합니다.

답변:


15

~/bin/ls재정의해야하는 bash 스크립트를 작성할 수 있습니다 /bin/ls. 실행하는 것을 잊지 마십시오 chmod +x ~/bin/ls.

방금 당신이 달성하고자하는 대부분의 일을하는 것처럼 보였습니다 (추가 인수를 전달하는 것을 포함하여)

#!/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

누군가 그것을 약간 정리하거나 출력 형식을 개선하고 싶을 수도 있지만 거기에 있습니다. 당신이 원하는대로 할 수 있습니다.

다음은 실제 샘플 출력입니다.

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

그리고 논쟁과 함께 :

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

여기에 나의 빠른 b이 있습니다.

$ 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

이 방법의 장점은 여러 디렉토리 탐색이 필요하지 않으며 출력이 준비되면 출력합니다. touch filename{0..10000}테스트 후 이것을 실행하십시오 .

functionalias줄을 삭제하여 ~/.bashrc영구적으로 만듭니다.

Oli의 벤치마킹 :

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
게시물에 일부 벤치마킹을 추가했습니다 (설명한대로). 예, 100,000 개가 넘는 디렉토리와 100,000 개가 넘는 파일로 절반의 시간이 걸리지 않습니다. 그러나 ls그 자체로는 여전히 훨씬 빠릅니다. 어느 쪽이든, 이것은 가장자리 경우입니다. 대부분의 사람들은 그렇게 큰 디렉토리 목록을 가지고 있지 않습니다. 정상적인 사람들에게는 눈에 띄는 차이가 거의 없습니다. awk그래도 좋아 . +1
Oli

4

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

디렉토리, 일반 파일, 링크를 순서대로 보여줍니다.

별명을 지정하면 이동하도록 설정됩니다.

다른 방법을 찾았습니다.

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

이것은 먼저 디렉토리를 수행하고 파일 이름을 채 웁니다.

다음 ~/.bashrc과 같이이 명령에 대한 별명을 작성할 수 있습니다.

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

샘플 출력 :

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

또는 두 번째 것 : alias ls2=ls -l --color -h --group-directories-first

샘플 출력 :

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는 다른 색으로 표시됩니다. -a숨겨진 파일도 포함하도록 추가 하십시오.

이를 위해 ls1 및 ls2 명령을 작성했습니다.


2

.bashrc에서 별칭 설정을 확장하는 것이 더 편리한 'ls'명령을 얻는 데 선호되는 방법입니다. 나는 특히 'lf'를 좋아합니다 ( 'tree'의 설치가 필요합니다).

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

2

유닉스 시스템에서 가장 강력한 도구 중 하나는 find명령입니다. 플래그 를 사용하여 ls출력 을 에뮬레이트 -ls하고 파일 유형을 -type플래그로 검색하는 데 사용할 수 있습니다 . 따라서 아래 그림은 정확히 같은 명령이지만 find두 가지 유형 을 검색하는 것입니다. printf진술 문은 먼저 리스팅을 원한다고 알려줍니다.

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

다음은 샘플 출력입니다.

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

예를 들어 앞에 점이있는 숨겨진 파일을 포함하여 모든 파일 이 find나열 됩니다.bashrc .

이제이 명령에보다 쉽게 ​​액세스 할 수 있도록의에 해당 별칭을 만드십시오 .bashrc. 내가 그렇게 만들었 어

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

소스 bashrc를 사용 . .bashrc하거나 종료하고 터미널을 입력하십시오. 이제 언제든지 별칭을 사용할 수 있습니다.


가장 강력한 도구? 과연. :)
AB

1

ls 많은 출력 사용자 정의를 지원하지 않습니다.

사용하다

 ls --group-directories-first -l

먼저 먼지를 얻을 수 있습니다.

한 번 봐 가지고 리무진 지원 이상의 출력 정의는 (그러나 모든 옵션을 지원하지 않는 LS에 대한 대안을 (기본적으로 설치되지 않음) ls)


0

내 최신 ls모드 ~/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 이름을 지정 ~/bin/myls했거나 시스템에 결코 도달하지 않는 루프에 매달릴 것 ls입니다.

샘플 출력 :

$ 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의 최신 LS 모드는 다음과 같습니다.

#!/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 ~ / bin / myls라는 이름을 지정했거나 시스템의 ls에 도달하지 않는 루프에서 중단됩니다.


ACCOUNT_NAME="$(getent passwd $UID | cut -d: -f1)"/bin/ls -l -F ...
waltinator
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.