모든 숨겨진 파일과 디렉토리를 glob하고 싶지만 현재( .
) 및 상위 디렉토리( ..
)는 glob하고 싶지 않습니다.
나는 배쉬를 사용하고 있습니다.
현재 동작을 관찰합니다.
$ ls -a
. .. ...a ...aa ..a ..aa .a .aa .aaa a
$ echo *
a
$ echo .*
. .. ...a ...aa ..a ..aa .a .aa .aaa
.*
나는 이것을하고 싶다
$ echo .*
...a ...aa ..a ..aa .a .aa .aaa
쉘 옵션이 있습니다dotglob
$ shopt -s dotglob
어떻게 든 작동합니다. 이제 *
모든 것을 (숨겨지든 아니든) glob 할 수 있지만 .
그렇지는 않습니다...
$ echo *
...a ...aa ..a ..aa .a .aa .aaa a
하지만 이제는 숨겨진 것인지 아닌지 구분할 수 없습니다. 또한 .*
여전히 글로브 .
와..
$ echo .*
. .. ...a ...aa ..a ..aa .a .aa .aaa
and .*
로 확장하지 않는 방법이 있나요 ?.
..
답변1
이 변수를 사용하여 디렉터리 를 GLOBIGNORE
숨길 수 있습니다 . 또한 숨겨진 파일과 숨겨지지 않은 파일이 일치하도록 옵션이 자동으로 설정됩니다. 그러나 수동으로 다시 설정을 해제하면 원하는 동작을 얻을 수 있습니다..
..
dotglob
*
dotglob
이 예를 보세요:
$ ls -a
. .. a .a ..a
$ GLOBIGNORE=".:.."
$ shopt -u dotglob
$ echo * # all (only non-hidden)
a
$ echo .* # all (only hidden)
.a ..a
댓글에서 많은 사용자가 시연한 다음과 같은 특수 사례에 유의하세요.
.
..
GLOBIGNORE
null이 아닌 값을 갖는 한 항상 무시됩니다.GLOBIGNORE=":" ; echo .*
예를 들어, 위의 예는 가독성이 떨어지긴 하지만 작동합니다.- 숨기기를 일치시키고 싶다면디렉토리만(모든 숨겨진 파일은 아님) 따라서 glob에는 후행 슬래시가 있습니다. 이를
echo .*/
설정해야 합니다GLOBIGNORE='.:..:./:../'
. glob이 일치./
하고../
결과에 표시되지 않도록 명시적으로 제외해야 하기 때문입니다.
답변2
아래의 첫 번째 glob에는 선행 점과 점이 아닌 문자가 하나 이상 추가로 필요합니다. 이 두 개의 glob은 여러 개의 점이 있는 파일을 포함하여 가능한 모든 숨겨진 파일과 일치하지만 정확히 사용자가 요구하는 .
or 는 일치하지 않습니다...
ls -ld .[!.]* ..?*
답변3
파일만 찾고 계시나요? 당신은 그것을 사용할 능력이 있습니까 find
?
다음과 같습니다(GNU 가정 find
):
find . -mindepth 1 -maxdepth 1 -name ".*" -printf "%P\n"
답변4
숨겨진 파일/폴더를 표시하고 싶지만 .
및 ..
?
이 bash 와일드카드를 사용하세요{.[!.]*,..?*}
견본
샘플 데이터를 생성해 볼 수 있습니다.
$ touch ...a ...aa ..a ..aa .a .aa .aaa a
$ mkdir ...b ...bb ..b ..bb .b .bb .bbb b
입증하다
아래에서 예상되는 삭제 항목을 볼 수 있습니다.
$ diff <(\ls -a) <(\ls -ad {.[!.]*,..?*})
1,3d0
< .
< ..
< a
11d7
< b
프로페셔널 버전
모든 숨겨진 요소를 제거하는 데 유용합니다. 예를 들면 다음과 같습니다.
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
# <regenerate sample data here>
$ rm -rf {.[!.]*,..?*}
# No error