„ls” pokazuje dwa identyczne pliki w katalogu

14

lsWydaje się więc, że polecenie pokazuje mi dwa identyczne pliki w katalogu.

$ 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

Mogę przenieść, zmienić nazwę, edytować itp. Jeden z plików, ale drugiego nawet nie ma. bashUzupełnianie tabulatorów pokazuje nawet identyczne pliki.

Na przykład wpisując poniższe, a następnie naciskając TAB

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

Jeśli zmienię nazwę pliku:

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

Uzupełnianie zakładki nadal pokazuje plik:

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

Ale oryginalny niezmodyfikowany plik nie jest wyświetlany jako „ls”

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

Jeśli jednak po prostu wymienię pliki jak w pierwszym fragmencie kodu powyżej, oto:

$ 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

Masz pomysł, co się tutaj dzieje i jak mogę pozbyć się tego pliku duchów?

To jest Mac z systemem OS X, jeśli to dodaje jakieś informacje do problemu. Użyłem sedtego pliku tuż przed rozpoczęciem szaleństwa.

Edytować

Użyłem zarówno flagi, jak blahi Blah lsflag bez zmiany widocznego wyniku.

Edytuj 2

Dodatkowe informacje wymagane w komentarzach:

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

Więcej:

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

Nawet więcej:

$ 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"

Uwaga

Poniższa odpowiedź pomogła mi zauważyć, że w nazwie znajdowało się spacje końcowe.

111 ---
źródło
6
Czy to możliwe, że w nazwie masz spację końcową?
fredtantini,
Hmmm… Nie, ukończenie wystarczy ls test\ … Co się stanie, jeśli użyjesz ls "*tftp.list*"? lub użyć lsz --show-control-chars?
fredtantini,
1
Czy możesz uruchomić coś takiego echo tftp* | xxdlub inny zrzut heksowy?
choroba
2
Jaka jest wydajność printf '<%q>\n' tftp*?
Chris Down,
3
Ponieważ twoje ustawienia regionalne to en_US.UTF-8, ls -bnie będą wyświetlać spacji w nazwach plików w żaden specjalny sposób, czy to w środku, czy na końcu nazwy pliku. Możesz użyć jednej z odpowiedzi (printf, echo) lub filtrować wynik ls za pomocą programu zaprojektowanego do wyróżnienia końcowych spacji, takiego jakls -1 tftp* | cat -vet
Mark Plotnick

Odpowiedzi:

22

Masz albo końcowe białe znaki, albo uszkodzony system plików.

Próbować

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

To powinno wypisać coś podobnego

'tftp.plist'
'tftp.plist '

zwróć uwagę na cytaty i dodatkowe miejsce. Jeśli wyśle ​​dokładnie to samo dwa razy, prawdopodobnie masz uszkodzony system plików.

Próbować

ls -i tftp.plist*

to da ci numery i-węzłów pliku. Jeśli są takie same, masz dwa razy ten sam plik w katalogu. To byłoby naprawdę złe (tm) i powinieneś uruchomić fsck jak najszybciej. Ale wątpię, że to jest problem; bardziej prawdopodobne jest to, że jest to spacja.

Wouter Verhelst
źródło
Wiesz, dlaczego końcowe białe znaki nie wyświetlały się przy użyciu flag blub Bz „ls”?
111 ---
@datUser: -Bnie ma z tym nic wspólnego i nie pokazujesz przykładu ls -b. Jednak z -blahtobą na pewno powinienem zobaczyć linię kończącą się na tftp.plist \
Steve Jessop
Tak, używałem obu bi Bani nie pokazuję spacji ani wartości znaku niedrukowalnego w czytelnym formacie. Bardzo dziwne IMHO.
111 ---
1
Możesz przekierować wyjście lsdo pliku i sprawdzić za pomocą lesslub edytora tekstu ...
Laszlo Valko
1
Dla tych, którzy wciąż się zastanawiają, zrzut heksowy ujawnia, że ​​nazwa to „tftp.plist” (to znaczy spacja końcowa).
Joshua