bash, 특정 제한 사항에 대해 "ls"를 작동하는 방법은 무엇입니까? [폐쇄]

bash, 특정 제한 사항에 대해 "ls"를 작동하는 방법은 무엇입니까? [폐쇄]

ls스위치에 포함되지 않은 이상한 제한 사항(예: --max-depth=다른 도구)이 많이 있는 것 같습니다. 나는 공통 표준을 유지하는 것을 좋아하지만(따라서 ls가장 ll일반적인 배포판의 표준을 따릅니다), 다른 별칭은 기억하기 쉬운 구문( lls"긴 목록, 안전" 등)을 따릅니다. 나는 이것을 몇 가지 다른 질문으로 나눌 수 있지만 이것은 모두 이 작업을 수행하는 일반적인 방법을 찾으려는 노력과 관련되어 있기 때문에 ls내가 말하는 내용을 설명하기 위해 내가 무엇을 할 것인지 목록을 만드는 것이 더 적절하다고 느꼈습니다. 그들은 모두 관련이 있습니다. 몇 가지 구체적인 질문:

  • 나는 종종 사람들이 루프 등 ls내에서 사용해서는 안된다고 말하는 것을 듣습니다 . for이는 기본적으로 하위 디렉터리가 표시되는 방식 등의 측면에서 의미가 있지만 하위 디렉터리 내부를 보지 않도록 ls쉽게 클립할 수 있는 방법이 있습니까 ? 페이지에서 비슷한 내용을 볼 수 없지만 ls하위 디렉토리에 클립하지 않으면 루프나 다른 구조에서 사용하는 것이 안정적일 것 같습니다 . 출력을 하나의 디렉터리로 잘라낸 다음 for 루프에서 사용하는 안정적인 방법이 있습니까 ?--max-depth=manlsforls

  • 나는 다소 투박하다고 생각되는 lld(디렉토리가 있는 긴 목록) 및 (파일이 있는 긴 목록) 구조를 사용했습니다 . llf"그냥 파일을 보고 싶어요"라고 말하는 더 좋은 방법이 있나요? 또는 "목차만 보고 싶은데요?"라고 하면 man페이지에 아무 것도 표시되지 않습니다. 특히 -l이 목록은 형식으로만 수행할 수 있습니다. 그렇지 않으면 표시하고 싶지 않은 항목을 정리할 수 없습니다. 일반적으로 말해서, 이런 방식으로 grep을 사용하는 것은 아마도 (잠금 형식 때문에 -l) 나쁜 생각이라고 생각합니다. 그렇다면 grep을 사용하는 대신 디렉토리 항목만 선택하거나 파일만 선택하는 더 좋은 방법이 있습니까?

  • 아래의 다른 방법 중 잘못된 형식이 있는 경우 더 나은 방법을 알고 싶습니다.

표준 출력 세트를 사용해 보십시오 ls(설정은 일반적으로 배포마다 다릅니다).

문자 []집합 와일드카드. 예를 들어 는 , , , 와 ls name[03][17].c일치하며 범위도 허용합니다.name01.cname07.cname31.cname37.c[]ls name[07][1-9].c

\ls를 사용하여 bare 명령을 실행 하려면 별칭을 무시하십시오.

항목에 -F표시기(그 중 하나 )를 연결합니다 .*/=>@|color=alwayscolor=auto.

ls재귀 측면에서 매우 어색합니다.ls *플래그가 없어도 모든 하위 폴더가 표시 -R되고 ls c*모든 폴더가 표시됩니다.c.

lsfor i in ls예측할 수 없으므로 a 내에서 an의 출력을 사용하지 마십시오 .

별칭으로 모호한 작업을 수행하고 싶지 않고 널리 사용되는 ls설정을 ll따른 l다음 다른 작업을 위해 다른 별칭을 추가하면 됩니다.

  • [[ $(type ls) == *"aliased"* ]] && then unalias lsalias: 필수는 아니지만 일반적 으로 조치를 취하기 위한 테스트 유형입니다.

  • alias ls='\ls --color=always --group-directories-first': l대부분의 배포판에서 일반 내용을 인쇄합니다 ls(즉, 파일이 표시되지 않습니다 .*!) . \명령이 복원되기 전에 명령이 별칭이 아닌 형식으로 복원된다는 점에 유의하십시오 .

  • alias l='ls -AFh --color=always --group-directories-first': 사용 -A(거의 모두, ./및 무시 ../하지만 모든 파일을 표시하고 거의 항상 파일을 보고 싶은 위치에 .*배치 )ls.*

  • alias la='ls -Ah': 긴 형식( -AFh또한 -l): l위의 별칭은 플래그 없이 ls bare를 실행하는 데 사용됩니다 \ls(주로 삭제 -A).

  • alias ll='ls -lAh': 긴 형식( -AFh또한 -l): 위의 별칭은 l플래그 없이 그대로 \ls실행하기 위한 것입니다 ls( -A대부분 제거).

alias l.='ls -d .*'    # Explicitly list just .* files, so ./ and ../ are shown, overriding the A flag
alias ls.='ls -d .*'   # Explicitly list just .* files, so ./ and ../ are shown, overriding the A flag, long format
alias ll.='ls -dl .*'  # Explicitly list just .* files, so ./ and ../ are shown, overriding the A flag, long format
alias lld='ls -FlA | grep :*/'      # Only directories
alias llf='ls -FlA | grep -v "/"'   # Only files (broken as will show symlinks etc, if have to use `/`, then `/$` would be better, but using grep at all is probably not optimal)
alias ldot="ls -ld .??*"            # Dotfiles only
alias lx="ls -FlA | grep *"         # Executable files only, below 'lxext' is just trying to find 'executable-like' files by their extension
alias lnox="ls -FlA | grep -v *"    # Everything except executable files
alias lxext='ll *.sh *.csh *.ksh *.c *.cpp *.py *.jar *.exe *.bat *.cmd *.com *.js *.vbs *.wsh *.ahk *.ps1 *.psm1 2> /dev/null'  # List possible executables and scripts by extensions, discarding error output (as will generate for every type that is not there)
alias lext='ls -Fla | egrep "\."'         # Files without extensions only   ".|/"
alias lnoext='ls -Fla | egrep -v "\."'    # Files without extensions only
alias lsp='find . -maxdepth 1 -perm -111 -type f'        # List executable by permissions.   ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}"   https://stackoverflow.com/q/7812324
alias lsum="ls -Fla \$1 \$2 \$3 \$4 \$5  | awk '{ print; x=x+\$5 } END { print \"total bytes = \",x }'"   # ls on required info then awk will sum the sizes
alias lll='ls --human-readable --size -1 -S --classify'  # Long-list with just size and name and total size summary line
alias lm='ls -Am'; alias lcsv='lm'         # comma separated view (-m), -A almost all, except '.' and '..'
alias lsz='ls -lAshSr'; alias lsize='lsz'  # -s size, -h human readable, -S by size, -r reverse so largest are easily visible at end
alias lt='ls -lAth'  ; alias ltime='lt'; alias ldate='lt'; alias lst='lt'   # sort by -t time/date, human readable
# replicate 'ls', but using 'stat' to show both normal 'ls' permission flags *and* octal.
lsec() { if [ -z "$@" ]; then args='. .*'; else args="$@"; fi; stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" $args; };   alias lstat='lsec';
lperm() { if [ -z "$@" ]; then args='. .*'; else args="$@"; fi; stat --printf="%A  %a  %n\n" $args; };   # Just permissions, %A (ls format), %a (Octal format) and names
sanitize() { chmod -R u=rwX,g=rX,o= "$@" ;}   # Make directory and file access rights the same
alias 000='echo "---------- (Owner -, Group -, and Other -)"; chmod 000'   # Remove permissions: append with file/directory to apply to
alias 644='echo "-rw-r--r-- (Owner rw, Group r, and Other r)"; chmod 644'  # Onwer rw, everyone else read-only
alias 755='echo "-rwxr-xr-x (Owner rwx, Group r-x, and Other r-x)"; chmod 755'  # Make executable, but only Owner has write permissions
alias mx='chmod a+x'   # Make Executable
alias lls='lss'        # Since the 'stat' output is in long format 'll', also use 'lls' for 'long listing with ecurity'
alias sl='ls'          # Common typo, also just overwrite the 'Steam Locotomive' toy if present, as that gets boring
alias lg='exa -lG'     # 'ls grid', exa is an interesting potential successor to 'ls', in Ubuntu 20.10 repo by default, colours each permission item and -lG is a useful 2x column long view.
if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null; then
    for d in /mnt/[a-z]; do [ -d /mnt/$(basename ${d}) ] && alias "$(basename ${d}):"="cd $d"; done         #  "d:" => cd to /mnt/d
    for d in /mnt/[a-z]; do [ -d /mnt/$(basename ${d}) ] && alias "l$(basename ${d}):"="cd $d && ll"; done   # "ld:" => cd to and list d:""
fi

답변1

사용에 대한 일반적인 조언 은 루프 ls에 관한 것이 아니라for모든 유형의 출력 구문 분석ls. 여기에는 이상한 파일 이름 ls | grep(예: 줄 바꿈 또는 전역 문자가 포함된 파일 이름) 으로 인해 거의 확실히 실패하는 항목이 포함됩니다 . 주의 깊게 읽어주세요https://mywiki.wooledge.org/ParsingLs그리고왜 `ls`를 구문 분석하지 *않나요*(그리고 어떻게 수행합니까)?.

요점은 루프나 다른 구문 분석 ls에서 이를 사용하고 싶지 않은 이유가 for하위 디렉터리와 관련이 없으며 ls결과를 표시하는 방법과 관련이 있다는 것입니다. 즉, ls(적어도 GNU ls, Linux의 기본값) 하위 디렉터리에 들어가지 않게 하는 플래그가 있습니다.

       -d, --directory
              list directories themselves, not their contents

예를 들어:

$ tree
.
├── dir1
│   ├── file1
│   ├── file2
│   └── file3
└── dir2
    ├── file1
    ├── file2
    └── file3

2 directories, 6 files

이제 비교해보세요:

$ ls *
dir1:
file1  file2  file3

dir2:
file1  file2  file3

그리고

$ ls -d *
dir1  dir2

이미 일부 별칭에서 사용했습니다.

lsd앨리어싱 에 관해서는 lsf그렇습니다. 말씀하신 것처럼 이것은 투박하고 이상한 파일 이름으로도 실패합니다. 디렉토리만 나열하는 "표준" 방법은 다음과 같습니다.

ls -d */

기본 파일만 가져오는 방법을 모르겠습니다 ls. 어떤 이유로든 정말 필요한 경우 다음을 사용할 수 있습니다 find.

find . -maxdepth 1 -type f

일반적 ls으로 스크립트가 아닌 인간을 위해 설계되었습니다. 따라서 구문 분석이 필요한 경우 항상 더 나은 도구가 있습니다. 보통 find또는 stat.


이러한 별칭 중 일부는 사용자가 염두에 두고 있는 것과 맞지 않습니다. 예를 들면 다음과 같습니다.

alias lx="ls -FlA | grep *"         # Executable files only, below 'lxext' is just trying to find 'executable-like' files by their extension
alias lnox="ls -FlA | grep -v *"    # Everything except executable files

별칭은 따옴표 없이 별칭을 생성하므로 *쉘은 grep별칭을 보기 전에 확장합니다. 따라서 두 개의 파일이 있는 디렉토리가 있는 경우:

$ ls
file1  file2

그러면 lx실제로 실행됩니다.

ls  -FlA | grep file1 file2

*디렉터리의 내용으로 확장되므로 결과적 으로 별칭이 완전히 무시되고 grep을 사용하여 파일에서 문자열을 file1 file2찾습니다 . ls이 두 가지에 대한 가능한 대안은 다음과 같습니다.file1file2

alias lx="find . -maxdepth 1 -executable -type f"
alias lnox="find . -maxdepth 1 -type f ! -executable"

28개의 별칭 목록을 살펴보는 것은 간단한 Q&A의 범위를 훨씬 넘어서지만 이것이 출발점 역할을 해야 합니다. 구문 분석은 잊어버리고 ls안전하게 수행할 수 없으므로 별칭을 find또는 stat대신 사용해야 합니다.

관련 정보