유닉스에서“ls”를 사용할 때 첫 번째 디렉토리와 파일 등을 정렬하는 방법…


91

ls명령 을 사용하여 먼저 디렉토리와 파일을 표시 하고 싶습니다 . 나는 시도했다 :

ls -la | sort -k 1

하지만 주문이 잘못되었습니다.


때문입니다 -오기 전에 d사용하는 경우sort
Nifle

4
옛날 유닉스 헤드 (GUI 이전 시대의 헤드)는 폴더 이름을 대문자로 사용하고 일반 파일 이름을 대문자로 만들어 그 결과를 자동으로 얻었습니다.
JRobert

유용한 질문! 아마도 허용 된 답변을 더 간단하고 터미널 색상을 깰 수없는 답변으로 변경해야 할 때가 있습니까?
ippi

시도ls -lh --group-directories-first
Diogo

답변:


28

다음 명령은 디렉토리를 먼저 나열하고 일반 파일을 둘째로 나열하며 링크는 세 번째로 나열합니다.

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

또한 키 입력을 저장하기 위해이 명령에 대한 별명 을 작성하는 것이 좋습니다 .

편집하다:

디렉토리를 먼저 원한 다음 디렉토리가 아닌 모든 것을 원한다면 다음을 사용하십시오.

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


1
예를 들어 폴더에 소켓 또는 FIFO가있는 경우이 명령은 모든 것을 나열하지 않습니다.
Studer

1
편집 된 버전은 여전히 ​​다른 유형과 작동해야합니다. 첫 번째 grep은 'd'로 시작하는 모든 것을 말하고 두 번째 grep은 'd'로 시작하지 않는 모든 것을 말합니다. 분명히 모든 것이 광고로 시작되거나 그렇지 않습니까?
Ry4an Brase

1
@Mark-왜 그렇게하지 ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"않겠습니까?
FCTW

1
@FCTW의 명령을 OSX 별칭으로 만들려면 ~ / .profile에 다음을 추가하십시오.alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
aliteralmind

2
나는 더 짧은 표기법을 찾았습니다 : ls -la|grep ^d;ls -la|grep -v ^d(따옴표는 필요하지 않으며로 대체 &&되었습니다 ;). 또 다른 옵션은 변수를 도입 한 다음 평가하는 것 a="ls -la|grep ^d";eval $a;eval $a -v입니다. ls/에 더 많은 옵션이 지정되어있을 때 반복을 피하는 데 유용 할 수 있습니다 grep. 그 ls -la --group-directories-first옵션 도 있지만, 가장 짧은 imo는ls -la|sort
Steven Pribilinskiy

204

나는 * nix를 좋아하고 이러한 답글 중 일부에 들어가는 독창성을 보는 것을 좋아합니다 ...

광산은 GNU Linux에서 그리 멋지지 않습니다.

alias ls='ls --color -h --group-directories-first'

Linux CLI 앱에 더 익숙하다면 OSX에서 coreutils도 업데이트하는 경향이 있습니다.

brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'

6
불행히도 osx 터미널에서는 작동하지 않습니다. 옵션을 사용할 수 없기 때문입니다.
MEM

7
다시 사랑 : 그 풍자? 그렇다면 동의합니다.
allyourcode 2018 년

4
별칭 ls의 목적은 90 %의 시간을 사용하려는 구성 요소를 정의하는 것입니다. 원하는 출력을 달성하기위한 적은 키 입력. 네이티브 ls 출력을 원한다면 언제든지 / bin / ls를 사용할 수 있습니다.
jonathanserafini

4
@MEM OS X를 사용하고 있고 터미널을 사용하는 것을 좋아한다면 brew install bash , 이것이 작동합니다! :)
Andrew Ashbacher 2016 년

5
내 의견 : 이것은 복잡한 grep 등이 아니라 정확하게 목표를 달성하기위한 명령 행 옵션을 나열한 것으로 받아 들여진 대답이되어야한다.
Ryan Griggs

17

Mac 사용자의 경우 coreutils :

brew install coreutils

alias ls='ls --color -h --group-directories-first'

시스템이 홈브류 로 준비되었다고 가정합니다 .


7
gls차라리. 권리?
Paul Irish

1
예, 기본적으로 기본적으로을 사용하여 coreutils를 사용할 수도 있습니다 PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH".
benesch

7

디렉토리 목록에보고 싶은 것이 있지만 지금까지 답변이 아래의 모든 요구 사항을 충족시키는 것은 아닙니다. 디렉토리 목록에 대한 나의 요구 사항 :

  1. 디렉토리와 파일은 알파벳순으로 정렬됩니다
  2. 디렉토리가 먼저 나열됩니다
  3. 심볼릭 링크 (심볼릭 링크)는 파일처럼 정렬됩니다
  4. 정렬은 대소 문자를 구분하지 않습니다
  5. 정렬은 파일 이름에서 알파벳이 아닌 모든 선행 문자를 무시합니다.
  6. 목록에는 총 디렉토리 수 ( ./및 제외 ../), 파일 및 링크가 포함됩니다.
  7. 목록에는 디렉토리 및 파일의 총 크기 (디스크 사용량)가 포함됩니다
  8. Linux와 Windows (Git Bash 셸)에서 목록이 동일하게 표시되어야 --group-directories-first합니다. Windows 용 Git Bash에서 작동하지 않는 등의 편리한 옵션을 사용하는 것이 가장 어려웠습니다.

많은 해킹 후 마침내 만족스러운 한 줄짜리 라이너 (긴 줄이지 만 ;-)가 나타났습니다. 이것을 'dir'이라는 별칭에 할당했습니다.

ls -dlF --color * .* | head -n2 && ls -AlF | LC_ALL=C grep "^d" | 
LC_ALL=C sort -k 9df && ls -AlF | LC_ALL=C grep "^[l-]" | 
LC_ALL=C sort -k 9df && echo -e `find -maxdepth 1 -type d ! -name . | 
wc -l` Dir\(s\) `du -hs | cut -f 1`\\t\\t`find -maxdepth 1 -type f | 
wc -l` File\(s\) `find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | 
tail -n 1 | cut -f 1`\\t\\t`find -maxdepth 1 -type l | wc -l` Link\(s\)

일을 더 쉽게 관리하기 위해 디렉토리 목록의 각 세그먼트를 원하는대로 출력하는 별도의 명령을 내린 다음 &&연산자를 사용하여 함께 정리했습니다 .

  • ls -dlF --color * .* | head -n2-추출 ./../. 우리는 sort그것들이 이미 올바른 순서이기 때문에 이것을 통과하고 싶지 않으며 , 그것들을 정렬하면 ../먼저 나열 될 수 있습니다 . -d옵션은 "전체"라인을 제거하는 것입니다; -F디렉토리에 슬래시를 표시 하기 위해 추가 하고 싶습니다 (일반적인 작업을 수행 할 때 심볼릭 링크를 "@"로 표시 함 ls -F).

  • ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df-디렉토리를 추출하고 파일 이름 (9 번째 열)을 기준으로 정렬합니다 (알파 / 스페이스가 아닌 문자 ( d옵션)와 문자 대소 문자 ( 옵션) 모두 무시 f). ls -A옵션 제외는 ./하고 ../목록에서 우리는 이미 이전 단계에서이를 추출하기 때문이다. 로케일 재설정으로 모든 grepsort명령 을 접두어로 사용하는 경향이 LC_ALL=C있습니다. 다루다.

  • ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df -이것은 위의 단계와 비슷하지만 이번에는 파일과 심볼릭 링크를 정렬합니다.

  • find -maxdepth 1 -type d ! -name . | wc -l- 디렉토리의 수를 가져 제외 ./하고 ../.

  • find -maxdepth 1 -type f | wc -l -파일 수를 얻습니다.

  • find -maxdepth 1 -type l | wc -l -심볼릭 링크 수를 얻습니다.

  • du -hs | cut -f 1 -모든 하위 디렉토리의 전체 크기를 사람이 읽을 수있는 형식으로 추출하십시오.

  • find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1 -사람이 읽을 수있는 형식으로 모든 파일의 전체 크기를 추출합니다.

새로운 dir별칭이 실제로 사용되는 것을 보자 !

전에:

$ ls -alF
total 22
drwxr-xr-x   13 Tom      Administ     4096 Oct 25 02:38 ./
drwxr-xr-x    3 Tom      Administ        0 Dec 24  2014 ../
drwxr-xr-x   15 Tom      Administ     4096 Sep 17 01:23 .VirtualBox/
-rw-r--r--    1 Tom      Administ      615 Oct 25 02:38 .aliases
-rw-r--r--    1 Tom      Administ    12742 Oct 24 11:47 .bash_history
-rw-r--r--    1 Tom      Administ     3234 Oct 24 15:06 .bash_profile
drwxr-xr-x    1 Tom      Administ        0 Jan 24  2015 .gem/
-rw-r--r--    1 Tom      Administ      586 Oct 24 03:53 .gitconfig
drwxr-xr-x    1 Tom      Administ     4096 Dec 28  2014 .ssh/
drwxr-xr-x    4 Tom      Administ        0 Jan 24  2015 .travis/
-rw-r--r--    1 Tom      Administ     6645 Oct 25 02:38 _viminfo
-rw-r--r--    1 Tom      Administ     4907 Oct 24 15:16 profile
drwxr-xr-x    1 Tom      Administ        0 Oct 24 22:20 tmp/

후:

$ dir
drwxr-xr-x   13 Tom      Administ     4096 Oct 25 02:38 ./
drwxr-xr-x    3 Tom      Administ        0 Dec 24  2014 ../
drwxr-xr-x    1 Tom      Administ        0 Jan 24  2015 .gem/
drwxr-xr-x    1 Tom      Administ     4096 Dec 28  2014 .ssh/
drwxr-xr-x    1 Tom      Administ        0 Oct 24 22:20 tmp/
drwxr-xr-x    4 Tom      Administ        0 Jan 24  2015 .travis/
drwxr-xr-x   15 Tom      Administ     4096 Sep 17 01:23 .VirtualBox/
-rw-r--r--    1 Tom      Administ      615 Oct 25 02:38 .aliases
-rw-r--r--    1 Tom      Administ    12742 Oct 24 11:47 .bash_history
-rw-r--r--    1 Tom      Administ     3234 Oct 24 15:06 .bash_profile
-rw-r--r--    1 Tom      Administ      586 Oct 24 03:53 .gitconfig
-rw-r--r--    1 Tom      Administ     4907 Oct 24 15:16 profile
-rw-r--r--    1 Tom      Administ     6645 Oct 25 02:38 _viminfo
      5 Dir(s) 2.8M           6 File(s) 31K           0 Link(s)

한 가지 사소한 단점은 파일 이름을 둘러싼 색상 제어 문자가 정렬을 너무 신뢰할 수 없기 때문에 색상 목록을 가질 수 없다는 것입니다.


최신 정보

위의 별명은 깊은 파일 시스템의 루트 디렉토리에서 실행될 때 고통스럽게 느리 므로이 단순하지만 훨씬 더 성능이 뛰어난 명령으로 업데이트했습니다.

ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'

샘플 출력 :

$ dir
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .aws/
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .gem/
drwxr-xr-x 1 Tom     0 Mar 29 19:32 .ssh/
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .zbstudio/
drwxr-xr-x 1 Tom     0 Jun 16  2016 temp/
drwxr-xr-x 1 Tom     0 Jul 13  2016 vimfiles/
-rw-r--r-- 2 Tom   365 Mar 30 10:37 .aliases
-rw-r--r-- 1 Tom 16028 Mar 30 12:12 .bash_history
-rw-r--r-- 2 Tom  2807 Mar 30 12:12 .bash_profile
-rw-r--r-- 2 Tom  2177 Mar 29 23:24 .functions
-rw-r--r-- 1 Tom  1091 Mar 30 10:34 .gitconfig
-rw-r--r-- 1 Tom  8907 Mar 29 14:45 _viminfo
-rw-r--r-- 1 Tom  2444 Jul 13  2016 _vimrc
33819 bytes

Windows 용 Git Bash의 새 버전이 지원 --group-directories-first되므로 더 이상 사용할 필요가 없습니다 sort. 새 별칭이 이전 별칭만큼 많은 정보를 표시하지 않더라도 성능 향상은 그 이상의 가치가 있습니다. 특권으로, 당신은 또한 색상을 얻을!


좋은 답변입니다! 그러나 “많이 해킹 한 후에 마침내 나는 하나의 라이너를 만들었습니다…” 그렇습니다. 실제로 그것은 고전적인 의미에서 실제로“하나의 라이너”가 아닙니다. 해당 논리를 가져 와서 독립형 셸 스크립트로 만들고이를 실행하거나 별칭으로 호출하는 것이 좋습니다.
JakeGould

@JakeGould 당신은 빠릅니다! 나는 아직 내 대답을 교정하는 것을 끝내지 않았으며 당신은 이미 그것을 읽었고 주석을 쏘았습니다. :). 예, 함수의 주요 후보이지만 그 당시에는 너무 게으 르기 때문에 .bash_aliases 파일에 넣었습니다. 반면에 나는 보통 매개 변수를 전달하지 않고는 무언가를 할 수 없을 때만 함수를 작성합니다.
thdoan

@ 10 basetom : 빠른 질문 : ls의 열에 대해 다른 색상을 어떻게 얻습니까? ls --color를 사용하여 파일 유형별로 파일 이름 을 채색 할 수 있지만 열에 유용한 색상을 얻는 방법은 보이지 않습니다. 비밀은 무엇입니까?
Pirx

@Pirx 열이 기본 스택 교환 구문 강조 :-)로 표시되어 있다고 생각합니다.
thdoan

그러나, 그것은 사실 인 것 같지만, 그것은 좋은 생각이며 해결책은 ;-)에 있습니다
Pirx

6

알파벳 순서를 유지 하려는지 여부에 따라 몇 가지 선택 사항이 있습니다.

당신은 단순히 시도 할 수 있습니다 :

LS-알 | 정렬 -k1 -r

또는 동일한 권한을 가진 파일의 알파벳 순서를 유지하려면 다음을 수행하십시오.

LS-알 | 정렬 -k1,1 -k9,9 -r

또는 eleven81이 말했듯이 (이 버전은 모든 것을 나열합니다)

LS -LA | grep "^ d"&& ​​ls -la | grep "^-"&& ls -al | grep -v "^ [d |-]"


1
이것은 더 좋은 솔루션 IMO입니다. 정렬을 위해 파이핑 대신 여러 프로세스와 파이프를 사용하여 정렬을 수행하는 것은 일종의 역으로 ​​보입니다. 특히 ls- al|sort -k1 -r효과가 있습니다. 누락 된 것은 단지 -r플래그입니다.
brice February

그이다 '종류'에 대해 날 귀찮게 것은 @brice ./../순서대로, 처음 두 행되지 않을 것이다. 그 외에는 더 효율적인 솔루션이라는 데 동의합니다.
thdoan

출력물을 채색하는 방법?
Danijel

5

delerious010의 대답은, 당신이 이전 스타일의 주문하려면 것을 추가합니다 :

LANG=C ls -la --group-directories-first

LC_ALL 또는 LANGUAGE 또는 LC_COLLATE를 "C"로 설정하여 사용하십시오.

이것은 다음과 비슷한 것을 줄 것입니다.

.
..
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file

정확하게 기억한다면 숨겨진 도트 파일은 원래 디렉토리 앞에 나타납니다.


2

이 작업을 수행하는 기능 (bash 또는 zsh)이 있습니다.

기능 lss
{
    # 맨 위에 디렉토리가있는 디렉토리 목록을 표시합니다.

    명령 ls --color = 항상 $ @ | egrep '^ d | total'
    명령 ls --color = 항상 $ @ | egrep -v '^ d | total';
}

참고로 이것은 작동하지 않는 것 같습니다. ls -l파일 형식별로 필터링 하려면 긴 목록 형식 ( ) 을 사용해야 합니다. 또한이 명령은 공백 (bash)에서 중단됩니다. 다음과 같이 인용해야합니다. "$@"이 방법을 사용하려면 다음과 같이 할 수 있습니다.function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
Six

2

ls -laX 먼저 알파벳순으로 디렉토리를 표시하지만 파일 목록을 고정시킵니다.

긴 옵션 :

ls
    -l    # List
    --all
    -X    # Sort alphabetically by entry extension

이것은 모든 디렉토리의 이름에 점이 없다는 것을 절대적으로 확신 할 수있는 경우에만 작동합니다.
eleven81

1

또 다른 방법 ...

find . -d 1 -type d | ls -la | sort -r 

또는

ls -la | sort -r

또는

d=`find . -type d -d 1`;f=`find . -type f -d 1`; echo -e -DIRS- "\n$d\n" -FILES- "\n$f"

이것들은 무엇을 하는가? 입력하는 법을 어디에서 배웠습니까?
Tamara Wijsman 2016 년

제가 가장 선호하는 OS는 데비안 리눅스입니다. ls의 데비안 gnu core utils 패키지 버전은 --show-directories-first 옵션을 지원합니다 ... OSX 사용을 시작했을 때 데비안 상자에서 내 bash 도트 파일을 모두 가져 와서 홈 디렉토리에 넣었습니다 ... 너무 많은 bash_aliases가 있었다 ... 그래서 그때 내 별칭에 대한 몇 가지 해결 방법을 찾아야했습니다 ...
Eddie B

첫 번째는 약간 중복됩니다 ... 디렉토리가 아닌 수정 해야하는 순서이므로 디렉토리를 정렬 할 이유가 없습니다 ... 'ls -la | sort -r '은 실제로 작동합니다. 기본적으로 그것은 말하고 있습니다 ... 1) A) 찾기. -d 1-타입 d (이 디렉토리에서 시작하여 하나의 디렉토리 깊이를 검색하고 디렉토리 만 검색) B) ls -la (파일을 모든 속성 나열) C) 역순으로 정렬 2) 1) 그냥 찾기를 삭제하십시오. .. 필요하지 않습니다 ... 실제로 Studers의 솔루션이 더 좋습니다 ... :-)
Eddie B

1

TL; DR

alias ls='ls -lhF --color'

list_sorted() {
    ls $* | grep "^d";
    ls $* | grep "^-";
    ls $* | grep -v -E "^d|^-|^total"
}

alias ll=list_sorted

설명

여기에 답변과 의견에 제공된 솔루션 조합을 사용합니다.

기본 ls

우선, 나는 다음에 대한 기본 동작을 덮어 씁니다 ls.

  • -l: 항상 목록을 1 차원의 수직 목록으로 표시
  • -h: 사람이 읽을 수있는 방식으로 파일 크기 표시 (예 : 4096 대신 4.0K)
  • -F: 디렉토리의 슬래시와 같은 표시기를 표시합니다.
alias ls='ls -lhF --color'

펼친 ll

다음으로 정렬 논리를 포함하는 함수를 작성합니다. 각각에 ls대해 원래 전달 된 인수를 전달합니다. 그러면 내가 나열하려는 작업 디렉토리와 다른 작업 디렉토리의 별칭을 사용할 수 있습니다 (예 :) ls -a ~.

또한 각 호출 lsgrep명령으로 파이프됩니다 . 여기에서 정렬이 이루어집니다. ls -l | grep "^d"예를 들어 디렉토리 만 나열합니다. 디렉토리가 먼저 나열되어야하는 경우,이 기능도 우선적으로 수행되어야합니다. 다음은 파일입니다.

마지막으로, 나는 디렉토리 나 파일이 아닌 모든 것을 보여줍니다 (디렉토리 내용의 총 크기를 나타내는 줄도). 이는 directoy, 일반 파일 항목 및 총 항목을 잡고 -v인수 를 통해 결과를 반전시켜 수행 됩니다.

list_sorted() {
    # List directories
    ls $* | grep "^d";
    # List regular files
    ls $* | grep "^-";
    # List everything else (e.g. symbolic links)
    ls $* | grep -v -E "^d|^-|^total"
}

마지막으로 함수를 새 명령에 별칭으로 지정합니다. 특히 ls일부 시나리오에서 함수가 중단되는 경우 를 덮어 쓰지 않습니다 . 그런 다음 사용할 수 있기를 원합니다 ls. 또는 항상 호출하여 에일 리어 징 제거 ls명령을 호출 할 수 있습니다 \ls.

alias ll=list_sorted

노트

  • 명령의 구분 기호 ;대신 대신 사용 &&합니다. 그렇지 않으면 디렉토리를 포함하지 않는 디렉토리의 내용을 나열 할 수 없습니다 (첫 번째 ls 명령은 false로 평가되므로 다음 명령이 &&. ;피하기 때문에 실행되지 않음 ).

0

이것은 스크립트 솔루션입니다. 알파벳 순으로 대소 문자를 구분하지 않고 열로 포맷 된 이름 만, inode 데이터는 표시하지 않습니다. ls의 기본 출력과 같이 열 주요 대신 행 주요입니다. 26자를 초과하는 파일 이름이 있으면 열이 약간 지저분 해집니다.

rm -f /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout

IFS=$'\n' read -d '' -r -a lines < /tmp/lsout

printf "%-24s  %-24s  %-24s\n" "${lines[@]}"

그리고 또 다른 형식이 추가되었습니다.

rm -f /tmp/lsout
echo "  ---- Directories ---- " >> /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s  %-24s  %-24s\n" "${lines[@]}"

rm -f /tmp/lsout
echo "  ------- Files ------- " >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s  %-24s  %-24s\n" "${lines[@]}"

마지막 출력은 다음과 같이 색상을 뺀 것과 같습니다.

  ---- Directories ----   archive/                  bookmarks/              
Desktop/                  Documents/                Downloads/              
fff/                      health/                   Library/                
Movies/                   Music/                    Pictures/               
Public/                   rrf/                      scifi/            
testdir/                  testdir2/                                         
  ------- Files -------   @todo                     comedy            
delme                     lll                       maxims                  
schedule                  vtokens style

이 스크립트가 호출하기 때문에 ls의 기본 동작을 별칭으로 지정하거나 변경하지 마십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.