내 시스템:
- 운영체제: 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 ls
BSD 일반 명령 매뉴얼의 페이지를 제공합니다. - 포탄:
- Bash: GNU bash, 버전 5.0.7(1)-릴리스(x86_64-apple-darwin18.5.0)
- Zsh: zsh 5.7.1 (x86_64-apple-darwin18.2.0)
ls
MacOS에서는 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를 사용하여 이를 달성하고 싶습니다 .-B
ls -B arg
ls
참고: 출력의 형식과 색상이 변경되므로 grep
(예: ls arg | grep '.*[^~]$'
)를 사용하고 싶지 않습니다 .grep
질문 요약: Mac에서 현재가 아닌 디렉토리의 내용을 나열하고 백업 파일은 나열하지 않으려면 어떻게 해야 합니까 ls
?
답변1
ls
서브셸에서 실행할 수 있습니다 .
(cd arg; ls -d *[^~])
답변2
macOS의 셸 변수와 bash
함께 사용 :GLOBIGNORE
basename
$ 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 -B
Linux 시스템에서 익숙한 방식으로 사용할 수도 있습니다.
답변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
.bashrc
bashrc_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
설정됩니다 . 예를 들면 다음과 같습니다..bashrc
LS_TYPE
LS_TYPE="BSD"
source ~/.config/bash/bashrc_aliases_lsBSD