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

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

내 시스템:

  • 운영체제: MacOS / Mac OS X (모하비 10.14.5)
  • OS 코어: 다윈(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)에 대한 절대 또는 상대 경로입니다.

나는 파일 이름 확장(일명 "globbing")과 옵션(내용이 아닌 디렉토리를 나열하는)을 사용하여 현재 디렉토리에 있는 백업이 아닌 컨텐츠를 나열하는 방법을 알고 있습니다. -d예: ls -d *[^~](또는 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출처: .bashrc)에 추가할 수 있습니다.

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

위에서 언급한 BSD 사용 기본 설정을 무시하는 경우 GNU 핵심 유틸리티를 설치하고(예: 를 통해 ) 원하는 별칭을 생성하여 (또는 에서 제공 ) ls문제 없이 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, 소스 제공 .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

관련 정보