터미널에서 숨겨진 파일 만 표시하는 방법은 무엇입니까?


154

수천 개의 파일이 포함 된 디렉토리가 있는데 그 중 일부는 숨겨져 있습니다.

이 명령 ls -a은 숨겨진 파일을 포함하여 모든 파일을 나열하지만 숨겨진 파일을 나열해야합니다.

어떤 명령을 사용해야합니까?


1
간단 ls -ld .*하거나 ls -ald .*작동합니다
John Strood

답변:


189

명령 :

ls -ld .?* 

숨겨진 파일 만 나열합니다.

설명 :

 -l     use a long listing format

 -d, --directory
              list  directory entries instead of contents, and do not derefer‐
              ence symbolic links

.?* will only state hidden files 

8
거기에 두 개의 물음표가 필요하지 않습니다. *는 그것을 포함합니다 (?는 하나의 문자에만 일치하고 *는 그 숫자와 일치합니다).
psusi

13
@psusi, 나는 그 의도를 배제 .하고 ..경기에서 제외하는 것이라고 생각합니다 . 그러나 그것은 또한 같은 (완벽하게 합법적) 단일 문자 숨겨진 파일 이름을 제외한다 .a, .1등등합니다. 아마도 더 나은 확장 글로브는 것 .!(|.)즉, 문자, 즉 아무것도 또는 다른 (단일)을 제외하고 아무것도 다음에 도트 도트ls -d .!(|.)
steeldriver

@steeldriver, 깔끔한, ?? 버전은 "."을 제외합니다. 그리고 "..". 이것은 흥미로운 기발한 결과 인 것 같습니다. *도 점과 일치하지만? 일치해야 뭔가 다른 이름이 무시됩니다.
psusi

디렉토리와 파일을 식별하려면 F 옵션을 추가하십시오. 즉, ls -ldF.? * 디렉토리 이름에는 마지막으로 표시된 문자 파일과 달리 "/"가 있습니다.
RCF

1
이것은 파일이 아닌 .vim과 같은 숨겨진 폴더를 나열하는 것을 제외하고는 거의 작동합니다. ls -ldp와 같이 약간 수정합니다.? * | grep -v / 이것은 숨김 폴더가 아닌 숨겨진 파일 만 나열
Fred Yang

31
ls -d .!(|.)

OP가 찾고있는 것을 정확하게 수행합니다.


1
어떻게 작동합니까?
SarcasticSully

로 디렉토리를 나열하십시오. 하나도 없이는 아무 것도 나열하지 않으면 번역 할 내용이 많습니다.
패트릭

1
에서 !(pattern-list)에서 pattern-list로 구분 된 하나 이상의 패턴 목록 이라는 것을 알고 |있지만 왼쪽에 패턴이없는 것이 혼란 스럽습니다 |. 저에게 그 구문을 설명해 주시겠습니까?
Carlos Mendoza

2
빈 패턴이 될 것 @CarlosMendoza, 그래서이 같다 .(아무것도 또는 다음에하지 .)을 제외한 .자체와 ...
muru September

16

현재 디렉토리에있는 파일을 원한다면 (재귀 없음) 할 수 있습니다

echo .[^.]*

이름이 a로 시작하고 .그 뒤에 점이 아닌 문자가 하나 이상인 모든 파일의 이름이 인쇄됩니다 . 이름이 연속적인 점으로 시작하는 파일의 경우에는 실패하므로 예를 들어 ....foo표시되지 않습니다.

당신은 또한 사용할 수 있습니다 find:

find -mindepth 1 -prune -name '.*'

-mindepth우리가 일치하지 않는 보장하지만 .-prune수단 find서브 디렉토리로 내려하지 않습니다.



4

사용 find하고 awk,

find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

설명:

find . -type f -> 현재 디렉토리의 모든 파일을 경로와 함께 나열하십시오.

./foo.html
./bar.html
./.foo1

awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

/필드 구분 기호 awk는 점으로 시작된 마지막 필드를 확인합니다. 점으로 시작하면 해당 줄의 마지막 필드를 인쇄합니다.


당신은 그냥 사용할 수 있습니다 find -type f. 검색 경로 또는을 명시 적으로 설정할 필요는 없습니다 -name "*".
terdon

3

find 이름 검색을 사용하는 것보다 복잡한 검색에 더 나은 옵션입니다.

find . -mindepth 1 -maxdepth 1 -name '.*'

또는

find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'

find . 현재 디렉토리를 검색

-mindepth 1제외합니다. 그리고 .. 목록에서

-maxdepth 1 검색을 현재 디렉토리로 제한

-name '.*' 점으로 시작하는 파일 이름 찾기

-o 또는

-name '*~' 물결표로 끝나는 파일 이름 찾기 (일반적으로 텍스트 편집 프로그램의 백업 파일 임)

그러나 이것과 다른 모든 대답은 현재 디렉토리의 .hidden파일 에있는 파일을 놓칩니다 . 스크립트를 작성하는 경우이 행은 .hidden파일 을 읽고 존재하는 파일 이름을 표시합니다.

if [[ -f .hidden]] # if '.hidden' exists and is a file
then
    while read filename # read file name from line
    do
        if [[ -e "$filename" ]] # if the read file name exists
        then
            echo "$filename" # print it
        fi
    done < .hidden # read from .hidden file
fi

무엇입니까 .hidden파일? .hidden파일 이름이 포함 된 파일 이있는 이유는 무엇 입니까? 어쨌든, 하나가 있다면 왜 필요한 모든 것이 복잡한 cat .hidden것일까 요? 귀하의 find명령은 정확하지만 (ish) -name '*~'는 관련이 없습니다. 물결표로 끝나는 파일은 백업 파일이지만 어떤 식으로도 숨겨지지 않습니다.
terdon

@terdon .hidden파일은 파일 / 폴더 이름을 점으로 시작하도록 변경할 수 없을 때 숨기려는 파일 및 폴더 용입니다. 물결표로 끝나는 파일은 시스템에 따라 다릅니다. ls -B대부분의 GUI 파일 탐색기와 마찬가지로 이러한 파일을 무시합니다.
Mark H

cat .hidden파일에 추가 된 후 해당 파일이 삭제되거나 이동 된 경우 더 이상 존재하지 않는 파일을 표시 할 수 .hidden있습니다.
Mark H

이것은 잘 작동합니다.
Penghe Geng

2

나는 당신이 다음 명령으로 그것을 할 수 있다고 생각합니다.

ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"

ls -a 입력 한 명령, 현재 작업 디렉토리의 모든 파일 및 디렉토리를 표시합니다.

grep "^\."내가 추가 한 명령은 숨겨진 파일 만 표시하도록 출력을 필터링합니다 (이름은로 시작합니다 ".").

grep -v "^\.$" | grep -v "^\..$" 내가 추가 한 명령은 출력을 필터링하여., ..를 제외합니다 (현재 및 상위 디렉토리입니다).

일부 파일 이름에 줄이 여러 개 "\n"있을 수있는 경우 위의 예가 올바르지 않을 수 있습니다.

따라서 문제를 해결하기 위해 다음 명령을 제안합니다.

find -maxdepth 1 -name ".[!.]*"


@ RaduRădeanu 나는 당신의 의견을 보았다, 너무 좋다. 내 답변을 다시 편집했습니다. 귀하의 의견에 감사드립니다.
xiaodongjie

2

당신이 할 수있는 다른 일, is ls .?*또는 ls .!(|)상단의 현재 디렉토리 숨겨진 파일 / 디렉토리 및 아래의 다른 파일 / 디렉토리의 모든 것을 보여줍니다

예 : 터미널에서

$ ls .?*       
.bash_history    .dmrc        .macromedia   .weather
.bash_logout     .gksu.lock   .profile      .wgetrc
.bash_profile    .bashrc.save .ICEauthority .toprc           .Xauthority
.bashrc          .lastdir     .viminfo      .xsession-errors
.bashrc~         .dircolors   .lynxrc       .vimrc           .xsession-errors.old

..:
Baron

.adobe:
Flash_Player

.aptitude:
cache  config

.cache:
compizconfig-1                              rhythmbox
dconf                                       shotwell

위의 결과에서 하위 디렉토리와 숨겨진 파일이있는 모든 파일 / 디렉토리가 바로 아래에 표시됩니다.

[1:0:248][ebaron@37signals:pts/4][~/Desktop]
$ ls .!(|)
.bash_aliases  .bashrc1  .bashrc1~

..:
askapache-bash-profile.txt  examples.desktop             Public           top-1m.csv
backups             Firefox_wallpaper.png        PycharmProjects          top-1m.csv.zip
Desktop             java_error_in_PYCHARM_17581.log  Shotwell Import Log.txt  topsites.txt
Documents           Music                Templates            Videos
Downloads           Pictures                 texput.log           vmware

죄송합니다. 댓글을 달 수 없습니다. 사이에 여기의 차이를 설명하기 ls .?*및 cioby23 응답 @ ls -d .[!.]* .??*그리고 실제로 두 번 숨겨진 파일을 인쇄 그대로 두 번 요구하고 있기 때문입니다 이유 .??*, .?*, .[!.]*그들이 그렇게 두 번 인쇄 할 다른 명령을 문자로 중 하나를 추가, 같은 일입니다.


1

다음을 사용할 수도 있습니다.

ls -d .[!.]* .??*

이를 통해 일반적인 숨김 파일과 2 또는 3 개의 점으로 시작하는 숨겨진 파일을 표시 할 수 있습니다. ..hidden_file


1
이것으로 모든 숨겨진 파일을 두 번 얻습니다.
TuKsn

1

당신은 명령을 사용할 수 있습니다

ls -Ad .??*

이는 ls -a | grep "^\."솔루션 의 grep 기반 접근 방식과 달리 다중 열 나열을 허용한다는 이점이 있습니다.


1

지금까지의 모든 대답은 이름이 점으로 시작하는 파일 (또는 디렉토리)이 "숨겨져"있다는 사실을 기반으로합니다. 효율적이지 않을 수도있는 다른 솔루션을 생각해 냈지만이 솔루션은 숨겨진 파일 이름에 대해 아무 것도 가정하지 않으므로 ..결과에 나열 하지 않습니다 (현재 허용되는 답변과 마찬가지로).

전체 명령은 다음과 같습니다.

ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)

설명

이것이하는 일은 모든 파일과 디렉토리를 두 ​​번 나열하는 것입니다.

echo -e "$(\ls)\n$(\ls -A)"

숨겨진 파일은 한 번만 표시합니다 -A.

그런 다음 목록이 정렬 | sort되어 일반 (숨겨지지 않은) 파일이 두 번 서로 표시됩니다.

그런 다음 두 번 이상 나타나는 모든 줄을 제거하고 | uniq -u고유 한 줄만 남겨 둡니다.

마지막으로 ls다시 사용 하여 모든 파일을 사용자 정의 옵션과 함께 나열하고 목록의 디렉토리 내용을 나열하지 마십시오 -d.

편집 (제한) :

muru이 지적했듯이 파일 이름이 두 줄로 나뉘어져 escaped\ncharacter.txt있기 때문에 이름이 같은 파일이 있으면이 솔루션이 올바르게 작동하지 않습니다 echo -e. 또한 같은 특수 문자를 제외하고 거의 같은 이름을 가진 두 개의 숨겨진 파일이있는 경우 예상대로 작동하지 않습니다 .foo[tab].txt.foo[new-line].txt그 모두로 인쇄로 .foo?.txt에 의해 제거 될 수는uniq -u


1
나는 이것이 숨겨진 파일의 정의라고 생각합니다. 이 숨겨진 파일의 출처조차도 .첫 번째 문자로 다루는 버그에서 비롯된 것 입니다.
muru

나는 첫 번째 단락에서 (사실로) 언급합니다. 그러나 그것은 여전히 ​​현재 허용되는 답변과는 다른 결과를 얻습니다
alejandro

물론, 제외 ..하지만 특수 문자가 포함 된 파일 이름으로 얼마나 잘 작동하는지 궁금합니다.
muru September

특수 문자의 의미를 정확히 알지는 못하지만이 솔루션은 파일 이름에 대해 아무 것도 가정하지 않기 때문에 문제가되지 않을 것이라고 생각합니다.
alejandro

실제로 파일 이름에는 줄 바꿈이 없어야합니다. 또한 : 파일 이름 echo -e에는 해석 할 이스케이프 시퀀스가 ​​없습니다 . 또한 : ls두 개의 서로 다른 파일 이름이 같은 표시받을 수 있도록 파일 이름을 난도질하지 않습니다 (예를 들어, 일부 버전에서 ls사용하는 ?특수 문자, 그래서 .foo\tbar( \t=> 탭을) 및 .foo\nbar( \n=> 줄 바꿈은) 모두로 표시됩니다 foo?bar).
muru

1

또는 다음을 사용할 수도 있습니다 echo .*

예 :

user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$

긴 목록 형식으로 선호하는 경우 공백을 새 줄로 변환하십시오.

user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$ 

0

bash를 사용하면 GLOBIGNORE특수 변수를 설정하면 비어 있지 않은 값으로도 무시 .하고 ..globs를 확장 할 때 충분합니다 . 에서 배쉬 문서 :

GLOBIGNORE쉘 변수 패턴 매칭 파일 이름의 세트를 제한 할 수있다. 경우에 GLOBIGNORE설정되고, 또한 패턴의 하나와 일치하는 각 매칭 파일명 GLOBIGNORE일치하는리스트에서 제거된다. 이 nocaseglob옵션을 설정 GLOBIGNORE하면 대소 문자와 관계없이 패턴의 일치 가 수행됩니다. 파일 이름 .이며 null이 아닌 ..경우 항상 무시됩니다 GLOBIGNORE. 그러나 GLOBIGNORE널이 아닌 값으로 설정하면 dotglob 쉘 옵션을 사용하는 효과가 있으므로 ‘.'로 시작하는 다른 모든 파일 이름 이 일치합니다.

우리가 설정하면 .:.., 모두 .와는 ..무시됩니다. 널이 아닌 것으로 설정하면이 동작을 얻을 수 있으므로 그냥 설정하면됩니다..

그래서:

GLOBIGNORE=.
ls -d .*
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.