2013-08-30 4 views
1

ls의 출력을 정렬하려고합니다. 내가 갈거야 순서는 이것이다 : (일부 점 파일을 포함 할 수 있음) + ls 명령의 출력 정렬

  • 모든 소프트 링크로 시작하는 이름으로
  • 어떤 디렉토리 _로 시작하는 이름을 가진

    • 어떤 디렉토리
    • 남아있는 모든 .files
    • 남아있는 모든 .directories
    • 다른 모든

    모든 것이 '하위 목록'내에서 알파벳 순으로 정렬됩니다. 지금은 find 명령을 여러 번 사용하여 위의 기준을 만족하는 파일을 찾습니다. 그 I 파이프를 발견의 출력을 따르는 것은 분류 한 후 LS에 전체 분류 목록을 통과 :

    #!/bin/bash 
    
    find1=`find . -maxdepth 1 -name "_*" -type d -printf "%f\n" | sort` 
    find2=`find . -maxdepth 1 -name "+*" -type d -printf "%f\n" | sort` 
    find3=`find . -maxdepth 1 -type l -printf "%f\n" | sort` 
    find4=`find . -maxdepth 1 -name ".*" -type f -printf "%f\n" | sort` 
    find5=`find . -maxdepth 1 \(! -name "." \) -name ".*" -type d -printf "%f\n" | sort` 
    find6=`find . -maxdepth 1 \(! -name "_*" \) \(! -name "+*" \) \(! -name ".*" \) \(! -type l \) -printf "%f\n"` 
    find="$find1 $find2 $find3 $find4 $find5 $find6" 
    ls -dfhlF --color=auto $find 
    

    이 공백이 어떤 이름을 처리하지 않고, 전반적으로 조금 지나친 것 같다. 나는 이것을 할 수있는 더 좋은 방법이있을 것이라고 확신한다. 어떤 아이디어?

  • +0

    내 머리 꼭대기에서'ls' 또는'ls -l'을 제안하고 매번 원하는 파일 (또는 원하지 않는 파일)을 grepping 할 것입니다. 'grep -v'는 패턴과 일치하지 않는 파일을 출력합니다. 'ls -l'의 출력을 사용하여 디렉토리와 링크를 찾을 수 있습니다. –

    +0

    'ls'의 결과를 파싱하는 것은 나쁜 생각입니다. 최악의 경우, 줄 바꿈을 포함하는 파일 이름이있을 수 있습니다.이 경우 줄 바꿈과 서식 지정을 위해 삽입하는 줄을 구별 할 수 없습니다. – chepner

    +0

    @AdamLiss 좀 더 자세히 설명해 주시겠습니까? 그 파일들만 나열하고 싶을 때 ls의 결과를 grep하고 특정 패턴을 검색한다는 의미입니까? 디렉토리의 내용을 특정 순서로 나열하는 강력한 솔루션을 원했습니다. 즉, ll ($ HOME/bin에 스크립트 이름)을 입력하고 목록의 내용을 긴 목록 형식 (ls -al 종류의 것)으로 표시하지만 목록을 특정 방식으로 구성하십시오. 목록을 더 읽기 쉽게 만듭니다. –

    답변

    0

    이 방법이 유용할까요? 지정한 순서대로 파일을 인쇄하지만 색상으로 인쇄하지는 않습니다. 이를 수행하기 위해서는 패턴 일치 전에 ANSI 코드를 이름에서 제거해야합니다. 그것은 그대로 공백이있는 파일 이름을 처리하지만 개행 문자 나 제어 문자가있는 파일 이름처럼 끔찍한 병리학 적 이름은 처리하지 않습니다.

    나는 awk 스크립트가 상당히 자명하지만, 설명을 원한다면 알려 주시기 바랍니다. BEGIN 라인은 ls 출력이 시작되기 전에 처리되고 모든 출력이 소비 된 후 END 라인이 처리됩니다. 다른 줄은 선택적 조건으로 시작하고 그 뒤에 중괄호로 묶인 일련의 명령이옵니다. 명령은 조건과 일치하는 행에서만 실행됩니다.

    ls -ahlF --color=none | awk ' 
        BEGIN { name_col = 45 } 
        { name = substr($0, name_col) } 
        name == "" { next } 
        /^d/ && substr(name, 1, 1) == "_" { under_dirs = under_dirs $0 "\n"; next } 
        /^d/ && substr(name, 1, 1) == "+" { plus_dirs = plus_dirs $0 "\n"; next } 
        /^l/ { links = links $0 "\n"; next } 
        /^[^d]/ && substr(name, 1, 1) == "." { dot_files = dot_files $0 "\n"; next } 
        /^d/ && substr(name, 1, 1) == "." { dot_dirs = dot_dirs $0 "\n"; next } 
        { others = others $0 "\n" } 
        END { print under_dirs plus_dirs links dot_files dot_dirs others } 
    '