디렉토리에 두 개의 동일한 파일을 표시하는 'ls'


14

그래서 어떻게 든 명령 ls이 디렉토리에 동일한 두 개의 파일을 표시하는 것 같습니다.

$ ls -Blah /System/Library/LaunchDaemons
total 32                                                              
drwxr-xr-x  266 root  wheel   8.8K Jun 18 10:41 .
drwxr-xr-x   79 root  wheel   2.6K Mar 31 12:28 ..
[redacted]
-rw-r--r--    1 root  wheel   715B Jun 18 10:36 tftp.plist
-rw-r--r--    1 root  wheel   715B Jun 18 10:35 tftp.plist

파일 중 하나를 이동, 이름 바꾸기, 편집 등 할 수는 있지만 다른 파일은 존재하지 않는 것 같습니다. bash탭 완성도 동일한 파일을 보여줍니다.

예를 들어 다음을 입력 한 다음 TAB

$ sudo mv /System/Library/LaunchDaemons/tftp
tftp.plist   tftp.plist

파일 이름을 바꾸면 :

$ sudo mv /System/Library/LaunchDaemons/tftp.plist /System/Library/LaunchDaemons/tftp.plist.derp

탭 완성에는 여전히 파일이 표시됩니다.

$ ls -Blah /System/Library/LaunchDaemons/tf
tftp.plist       tftp.plist.derp 

그러나 수정되지 않은 원본 파일은 'ls'로 표시되지 않습니다

$ ls -Blah /System/Library/LaunchDaemons/tftp.plist
ls: /System/Library/LaunchDaemons/tftp.plist: No such file or directory

그러나 위의 첫 번째 코드 스 니펫과 같이 파일을 나열하면 보라.

$ ls -Blah /System/Library/LaunchDaemons
total 32                                                              
drwxr-xr-x  266 root  wheel   8.8K Jun 18 10:41 .
drwxr-xr-x   79 root  wheel   2.6K Mar 31 12:28 ..
[redacted]
-rw-r--r--    1 root  wheel   715B Jun 18 10:35 tftp.plist
-rw-r--r--    1 root  wheel   715B Jun 18 10:36 tftp.plist.derp

여기서 무슨 일이 일어나고 어떻게이 유령 파일을 제거 할 수 있습니까?

문제에 정보를 추가하면 OS X를 실행하는 Mac입니다. 나는 sed이 파일 을 사용 하기 시작했고 바로이 순간이 시작되었습니다.

편집하다

나는 둘 다 사용했습니다 blahBlah ls명백한 출력의 변화없이 플래그.

편집 2

의견으로 요청 된 추가 정보 :

$ echo tftp* | xxd
0000000: 7466 7470 2e70 6c69 7374 2020 7466 7470  tftp.plist  tftp
0000010: 2e70 6c69 7374 2e64 6572 700a            .plist.derp.

더:

$ printf '<%q>\n' tftp*
<tftp.plist\ >
<tftp.plist.derp>

더 나아가:

$ locale                                                                                                                      │-rw-r--r--    1 root  wheel   495B Sep  9  2014 org.net-snmp.snmpd.plist
LANG="en_US.UTF-8"                                                                                                            │-rw-r--r--    1 root  wheel   498B Jan 15 23:15 org.ntp.ntpd.plist
LC_COLLATE="en_US.UTF-8"                                                                                                      │-rw-r--r--    1 root  wheel   1.0K Nov 13  2014 org.openldap.slapd.plist
LC_CTYPE="en_US.UTF-8"                                                                                                        │-rw-r--r--    1 root  wheel   572B Sep  9  2014 org.postfix.master.plist
LC_MESSAGES="en_US.UTF-8"                                                                                                     │-rw-r--r--    1 root  wheel   238B Sep  9  2014 shell.plist
LC_MONETARY="en_US.UTF-8"                                                                                                     │-rw-r--r--    1 root  wheel   941B Sep  9  2014 ssh.plist
LC_NUMERIC="en_US.UTF-8"                                                                                                      │-rw-r--r--    1 root  wheel   260B Sep  9  2014 telnet.plist
LC_TIME="en_US.UTF-8"                                                                                                         │-rw-r--r--    1 root  wheel   715B Jun 18 10:36 tftp.plist
LC_ALL="en_US.UTF-8"

노트

아래의 답변은 이름에 후행 공백이 있음을 알 수 있도록 도와줍니다.


6
이름에 후행 공백이있을 수 있습니까?
fredtantini 2016 년

흠… 아니오, 완성은 할 것입니다 ls test\ … 사용하면 ls "*tftp.list*"어떻게됩니까? 또는 사용 ls으로 --show-control-chars?
fredtantini 2016 년

1
같은 echo tftp* | xxd또는 다른 hexdump 를 실행할 수 있습니까 ?
choroba 2016 년

2
출력은 printf '<%q>\n' tftp*무엇입니까?
Chris Down

3
로케일이기 때문에 en_US.UTF-8, ls -b중간에 또는 파일 이름의 끝 부분에 있는지, 어떤 특별한 방법으로 파일 이름에 공백을 표시하지 않습니다. 다음과 같은 후행 공백을 강조하도록 설계된 프로그램으로 응답 (printf, echo) 또는 filter ls의 출력 중 하나를 사용할 수 있습니다.ls -1 tftp* | cat -vet
Mark Plotnick

답변:


22

공백이 있거나 파일 시스템이 손상되었습니다.

시험

for i in tftp.plist*
do
    echo "'$i'"
done

그것은 다음과 같은 것을 출력해야합니다

'tftp.plist'
'tftp.plist '

따옴표와 추가 공간을 기록하십시오. 정확히 같은 것을 두 번 출력하면 파일 시스템이 손상되었을 수 있습니다.

시험

ls -i tftp.plist*

파일의 inode 번호가 표시됩니다. 파일이 동일하면 디렉토리에 동일한 파일이 두 번있는 것입니다. 정말 나쁜 것이므로 fsck asap를 실행해야합니다. 그러나 나는 그것이 문제라는 것을 의심한다. 공백 일 가능성이 큽니다.


'ls`와 함께 bor B플래그를 사용하여 후행 공백이 나타나지 않는 이유는 무엇입니까?
111 ---

@datUser : -B는 이것과 관련이 없으며의 예를 보여주지 않습니다 ls -b. 그러나 -blahtftp.plist로 끝나는 줄을 반드시 보셨을 것입니다.
Steve Jessop

네 , 둘 다 사용 b하고 B있으며 이스케이프 된 공간이나 인쇄 할 수없는 문자의 값을 읽을 수있는 형식으로 표시하지 않습니다. 매우 이상한 IMHO.
111 ---

1
출력을 ls파일로 재 지정 less하거나 텍스트 편집기로 확인할 수 있습니다 .
Laszlo Valko

1
아직도 궁금한 사람들을 위해 hexdump는 이름이 "tftp.plist"(즉, 후행 공간)임을 밝힙니다.
Joshua
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.