Mac에서 BSD 명령 ls를 사용하여 백업 파일(~로 끝남)을 표시하지 않고 현재가 아닌 디렉토리의 내용을 나열하려면 어떻게 해야 합니까?

Mac에서 BSD 명령 ls를 사용하여 백업 파일(~로 끝남)을 표시하지 않고 현재가 아닌 디렉토리의 내용을 나열하려면 어떻게 해야 합니까?

내 시스템:

  • 운영 체제: MacOS / Mac OS X (Mojave 10.14.5)
  • 운영 체제 코어: Darwin(18.6.0)
  • 커널: 다윈 커널/XNU(18.6.0/xnu-4903.261.4~2/RELEASE_X86_64)
  • ls: 버전을 알 수 없지만 man lsBSD 공통 명령 매뉴얼의 페이지를 제공합니다.
  • 껍데기:
    • Bash: GNU bash, 버전 5.0.7(1)-릴리스(x86_64-apple-darwin18.5.0)
    • zsh: zsh 5.7.1 (x86_64-apple-darwin18.2.0)

lsMacOS에서는 bash 또는 zsh와 같은 셸을 사용하는 터미널 CLI에서 (BSD) 명령 (또는 유사한 일반적이고 유용한 도구)을 사용하여 현재 작업 디렉터리가 아닌 디렉터리의 내용을 나열하려고 합니다 ~. 물결표( )로 끝나는 파일을 제외한 파일.

마지막 규정을 제외하면 ls이는 현재가 아닌 디렉토리가 다음 인수로 사용될 때 자연스럽게 수행될 수 있습니다 ls. ls arg여기서 는 arg현재가 아닌 디렉토리에 대한 절대 또는 상대 경로입니다(예: /absolute/path/to/directory, ~/path/from/home/to/directory또는 path/from/current/dir/to/directory).

-dls -d *[^~]나는 파일 이름 확장("globbing"이라고도 함)과 다음 과 같은 옵션(내용 대신 디렉터리 나열)을 사용하여 현재 디렉터리의 백업이 아닌 콘텐츠를 나열하는 방법을 알고 있습니다 ls -d *[!~]. 동일한 유형의 결과를 원하지만 현재 디렉토리가 아닌 경우입니다.

ls -d arg/*[^~]위에서 설명한 것과 동일 arg하지만 결과에는 각 콘텐츠 요소(즉, 관심 디렉터리의 모든 파일 및 디렉터리)에 대한 경로가 표시됩니다 . ls를 사용하는 것처럼 경로를 표시하지 않고 각 요소를 표시하고 싶습니다 ls arg.

Linux에서는 GNU 명령을 사용하여 ls백업 파일을 나열하지 않는 옵션을 사용하여 원하는 것을 얻을 수 있습니다. 이것이 내가 원하는 것이지만, 이를 달성하기 위해 MacOS 기본 도구(BSD 선호)를 사용하고 싶습니다.-Bls -B argls

참고: 출력의 형식과 색상이 변경되므로 grep(예: ls arg | grep '.*[^~]$')를 사용하고 싶지 않습니다 .grep

질문 검토: Mac에서 현재가 아닌 디렉토리의 내용을 나열하지만 백업 파일은 나열하지 않는 방법을 사용하는 것이 가장 좋습니까 ls?

답변1

ls서브쉘에서 실행할 수 있습니다 :

(cd arg; ls -d *[^~])

답변2

macOS뿐만 아니라 쉘 변수도 bash사용 하세요 .GLOBIGNOREbasename

$ mkdir dir
$ touch dir/file{1,2}{,~}
$ ls -R
dir

./dir:
file1   file1~  file2   file2~
$ GLOBIGNORE=*~
$ ls -d dir/*
dir/file1       dir/file2
$ basename -a dir/*
file1
file2

-로 설정하면 GLOBIGNORE분리된 패턴 목록으로 :인해 파일 이름 완성이 이러한 패턴을 무시하게 됩니다.

macOS의 유틸리티는 basename여러 경로 이름을 허용하며 -a옵션을 사용하는 경우 해당 경로 이름의 파일 이름 부분만 포함된 목록을 반환합니다.

대신 패턴을 사용할 수 있습니다 GLOBIGNORE(특정 파일 이름 패턴 확장자를 무시하는 보다 일반적인 방법 제공) *[!~]( 정규식 종류의 문자를 부정하는 !동안 셸의 문자 클래스를 부정한다는 점에 유의하세요).^

unset GLOBIGNORE
basename -a dir/*[!~]

...또는 Homebrew에서 GNU coreutils를 설치하고 gls -BLinux 시스템에서 익숙한 방식으로 사용할 수 있습니다.

답변3

깔끔한 대답은 하위 쉘을 사용하여 현재가 아닌 디렉토리에서 명령을 실행하는 것입니다.

(cd arg; ls -d *[^~])

그러나 현재 디렉터리뿐만 아니라 현재가 아닌 디렉터리에서도 작동하는 일반 기능을 만들려면 다음을 .bashrc(또는 bashrc_aliases_lsBSD, from .bashrc)에 추가할 수 있습니다.

alias ls='/bin/ls'
alias   l=''
unalias l
function l () { ( if [[ -n "$@" ]]; then cd "$@"; fi ; /bin/ls -d *[^~] ) }

ls위에서 언급한 BSD 사용 선호에 어긋나는 경우, GNU 핵심 유틸리티를 설치하고(예: 를 통해) (위 코드를 사용하는 대신) (또는 소스에서) 필요한 별칭을 생성하여 이를 피할 수 있습니다. 문제 없는 GNU:brew install coreutils.bashrcbashrc_aliases_lsGNU.bashrc

alias ls='/usr/local/bin/gls'
alias l='/usr/local/bin/gls -B'

내 현재 솔루션은 두 구조를 모두 사용하고 필요할 때 내가 호출하는 변수 LS_TYPE와 내가 호출하는 함수 ls-switch( bashrc_aliases, source: 에 정의됨 .bashrc)를 사용하여 두 구성 파일 중 하나를 가져오는 구조 사이를 전환하는 것입니다.

function ls-switch () {
    if [[ $LS_TYPE = "GNU" ]] ; then
        LS_TYPE="BSD"
        source ~/.config/bash/bashrc_aliases_lsBSD
    elif [[ $LS_TYPE = "BSD" ]] ; then
        LS_TYPE="GNU"
        source ~/.config/bash/bashrc_aliases_lsGNU
    fi
}

ls이 배열을 사용하면 먼저 가져올 프로필을 정의하고 선택하여 및 의 기본 동작이 l설정 됩니다. 예:.bashrcLS_TYPE

LS_TYPE="BSD"
source ~/.config/bash/bashrc_aliases_lsBSD

관련 정보