답변:
명령 :
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
.
하고 ..
경기에서 제외하는 것이라고 생각합니다 . 그러나 그것은 또한 같은 (완벽하게 합법적) 단일 문자 숨겨진 파일 이름을 제외한다 .a
, .1
등등합니다. 아마도 더 나은 확장 글로브는 것 .!(|.)
즉, 문자, 즉 아무것도 또는 다른 (단일)을 제외하고 아무것도 다음에 도트 도트ls -d .!(|.)
ls -d .!(|.)
OP가 찾고있는 것을 정확하게 수행합니다.
!(pattern-list)
에서 pattern-list
로 구분 된 하나 이상의 패턴 목록 이라는 것을 알고 |
있지만 왼쪽에 패턴이없는 것이 혼란 스럽습니다 |
. 저에게 그 구문을 설명해 주시겠습니까?
.
(아무것도 또는 다음에하지 .
)을 제외한 .
자체와 ..
.
사용 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 "*"
.
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 '*~'
는 관련이 없습니다. 물결표로 끝나는 파일은 백업 파일이지만 어떤 식으로도 숨겨지지 않습니다.
.hidden
파일은 파일 / 폴더 이름을 점으로 시작하도록 변경할 수 없을 때 숨기려는 파일 및 폴더 용입니다. 물결표로 끝나는 파일은 시스템에 따라 다릅니다. ls -B
대부분의 GUI 파일 탐색기와 마찬가지로 이러한 파일을 무시합니다.
cat .hidden
파일에 추가 된 후 해당 파일이 삭제되거나 이동 된 경우 더 이상 존재하지 않는 파일을 표시 할 수 .hidden
있습니다.
나는 당신이 다음 명령으로 그것을 할 수 있다고 생각합니다.
ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
ls -a
입력 한 명령, 현재 작업 디렉토리의 모든 파일 및 디렉토리를 표시합니다.
grep "^\."
내가 추가 한 명령은 숨겨진 파일 만 표시하도록 출력을 필터링합니다 (이름은로 시작합니다 "."
).
grep -v "^\.$" | grep -v "^\..$"
내가 추가 한 명령은 출력을 필터링하여., ..를 제외합니다 (현재 및 상위 디렉토리입니다).
일부 파일 이름에 줄이 여러 개 "\n"
있을 수있는 경우 위의 예가 올바르지 않을 수 있습니다.
따라서 문제를 해결하기 위해 다음 명령을 제안합니다.
find -maxdepth 1 -name ".[!.]*"
ls
해서는 안됩니다 .
당신이 할 수있는 다른 일, 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 .[!.]* .??*
그리고 실제로 두 번 숨겨진 파일을 인쇄 그대로 두 번 요구하고 있기 때문입니다 이유 .??*
, .?*
, .[!.]*
그들이 그렇게 두 번 인쇄 할 다른 명령을 문자로 중 하나를 추가, 같은 일입니다.
지금까지의 모든 대답은 이름이 점으로 시작하는 파일 (또는 디렉토리)이 "숨겨져"있다는 사실을 기반으로합니다. 효율적이지 않을 수도있는 다른 솔루션을 생각해 냈지만이 솔루션은 숨겨진 파일 이름에 대해 아무 것도 가정하지 않으므로 ..
결과에 나열 하지 않습니다 (현재 허용되는 답변과 마찬가지로).
전체 명령은 다음과 같습니다.
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
.
첫 번째 문자로 다루는 버그에서 비롯된 것 입니다.
..
하지만 특수 문자가 포함 된 파일 이름으로 얼마나 잘 작동하는지 궁금합니다.
echo -e
에는 해석 할 이스케이프 시퀀스가 없습니다 . 또한 : ls
두 개의 서로 다른 파일 이름이 같은 표시받을 수 있도록 파일 이름을 난도질하지 않습니다 (예를 들어, 일부 버전에서 ls
사용하는 ?
특수 문자, 그래서 .foo\tbar
( \t
=> 탭을) 및 .foo\nbar
( \n
=> 줄 바꿈은) 모두로 표시됩니다 foo?bar
).
bash를 사용하면 GLOBIGNORE
특수 변수를 설정하면 비어 있지 않은 값으로도 무시 .
하고 ..
globs를 확장 할 때 충분합니다 . 에서 배쉬 문서 :
GLOBIGNORE
쉘 변수 패턴 매칭 파일 이름의 세트를 제한 할 수있다. 경우에GLOBIGNORE
설정되고, 또한 패턴의 하나와 일치하는 각 매칭 파일명GLOBIGNORE
일치하는리스트에서 제거된다. 이nocaseglob
옵션을 설정GLOBIGNORE
하면 대소 문자와 관계없이 패턴의 일치 가 수행됩니다. 파일 이름.
이며 null이 아닌..
경우 항상 무시됩니다GLOBIGNORE
. 그러나GLOBIGNORE
널이 아닌 값으로 설정하면 dotglob 쉘 옵션을 사용하는 효과가 있으므로‘.
'로 시작하는 다른 모든 파일 이름 이 일치합니다.
우리가 설정하면 .:..
, 모두 .
와는 ..
무시됩니다. 널이 아닌 것으로 설정하면이 동작을 얻을 수 있으므로 그냥 설정하면됩니다..
그래서:
GLOBIGNORE=.
ls -d .*
ls -ld .*
하거나ls -ald .*
작동합니다