현재 디렉터리와 상위 디렉터리를 제외한 모든 숨겨진 파일을 전역적으로 표시하는 방법

현재 디렉터리와 상위 디렉터리를 제외한 모든 숨겨진 파일을 전역적으로 표시하는 방법

모든 숨겨진 파일과 디렉토리를 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

댓글에서 많은 사용자가 시연한 다음과 같은 특수 사례에 유의하세요.

  • ...GLOBIGNOREnull이 아닌 값을 갖는 한 항상 무시됩니다. 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

관련 정보