결론부터 말하자면, 이 동작들은 ls 만으로는 불가능하다. 따라서, 현재 디렉토리에만 사용하기 위한 alias 는 만들 수 있지만, 다른 디렉토리명을 인수로 주고 싶다면, alias 사용은 불가능하다. 이럴 땐 script/function 등을 만들어야 한다.
또는, ls 가 아닌 find 로 할 수도 있긴 한데, 좀 복잡해지므로 그냥 ls + 로 만족하기로 한다. (여기서 + 는 다른 프로그램들)
NixCraft 에 영광(?)을 돌린다.
또, 이 내용을 이해하려면 기본 Regex 지식이 있어야 한다.
파일만 표시
ls -l | egrep -v '^d'
grep/egrep 결과는 같다.
또는, 좀 더 길게 이렇게 쓸 수도 있다.
ls -l | grep '^[-|l]'
결과는 같다. (엄밀하게 말하자면, 같다고 말할 수 있을 정도로 차이가 거의 없다. 유일한 차이라면 첫 명령에는 ‘합계(total)’ 행이 포함된다는 정도?)
첫 명령에 쓰인 -v
는, --invert-match
로서, 매칭값의 반대, 즉 ‘매칭되지 않은 값’을 표시하라는 뜻이다. 즉, ^d 로 시작하지 않는 행만 선택하게 된다.
따라서, 다음에 쓰겠지만, ‘디렉토리만!’은 단순히 ^d 를 넘겨주면 된다.
잠깐!
ls -l
에서 파일은 – 로 시작하거나, 또는 l 로 시작한다. 일반파일은 – 로, 링크는 l 로. 헌데, 디렉토리 링크도 l 로 표시되므로, 위 두가지 방법 모두 이것까지 막아줄 수는 없다. (즉, 디렉토리 링크는 ‘파일만’에 표시가 된다.)
마찬가지로, ls -l
에서 디렉토리는 d 로 시작한다. 따라서, ‘^d’ 를 주면 디렉토리만 선택하게 된다.
디렉토리만!
위에서 설명은 다 했으므로..
ls -l | grep '^d'
Alias?
이런 식으로 만들면 되긴 되는데..
alias lsdir="ls -l | grep '^d'"
이 명령은 ‘현재 디렉토리’에만 쓸 수가 있다는 한계가 있다. 다른 디렉토리에 적용하고 싶으면 명령을 모두 다 써줘야 한다.
이를 위해선 스크립트를 만들거나, 아니면 function 을 써야 한다.근데, 아직 함수를 써 본적이 없어서.. 이번 기회에 함 해볼까??
Function
뻘짓과 뻘짓 속에, 아주 허무하게 방법을 알아냈다.
- zsh/oh my zsh 사용 중이라면 ~/.oh-my-zsh/custum 에 .sh 파일을 만들고 실행 속성을 주고 함수를 넣는다.
- bash 는 안해봐서 확실하진 않지만, 아마도 ~/.bashrc 에 넣으면 될 듯..?
# ls : 파일만 표시 function lsf() { ls -l "$@"| grep '^[-|l]' } # ls : 디렉토리만 표시. function lsd() { ls -l "$@"| grep '^d' }
이러면 ls 옵션을 그대로 다 넣고 사용할 수 있다. 이런 식으로.
$ lsf -tr -G ~/다운로드 --human-readable ......
결과 중 몇 줄만 출력하려면? (head/tail 사용)
이 역시 외부 프로그램을 이용해야 한다.
ls -al | grep -v '^d' | head -n 30
원하는 결과에 따라, head
나 tail
을 쓴다.
시간 순 정렬?
위 출력은 모두 외부 프로그램의 힘을 빌렸지만, ‘정렬’만큼은 ls 에서 해줄 수 있다.
ls -t
: 최신이 맨 처음 표시됨.ls -tr
: t 의 반대. 최신이 맨 나중 표시됨.
내용은 짧은데, 글 쓰는 시간은 오래 걸렸네!!!