내 시스템:
- 운영 체제: 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 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
).
-d
ls -d *[^~]
나는 파일 이름 확장("globbing"이라고도 함)과 다음 과 같은 옵션(내용 대신 디렉터리 나열)을 사용하여 현재 디렉터리의 백업이 아닌 콘텐츠를 나열하는 방법을 알고 있습니다 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
, 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
.bashrc
bashrc_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
설정 됩니다. 예:.bashrc
LS_TYPE
LS_TYPE="BSD"
source ~/.config/bash/bashrc_aliases_lsBSD