'ls' montrant deux fichiers identiques dans un répertoire

14

Donc, en quelque sorte, la commande lssemble me montrer deux fichiers identiques dans un répertoire.

$ 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

Je peux déplacer, renommer, éditer etc. l'un des fichiers, mais l'autre ne semble même pas être là. bashla complétion des onglets montre même des fichiers identiques.

Par exemple, saisir ce qui suit, puis appuyer sur TAB

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

Si je renomme le fichier:

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

L'achèvement de l'onglet montre toujours le fichier:

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

Mais le fichier d'origine non modifié n'apparaît pas à «ls»

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

Cependant, si je liste simplement les fichiers comme dans le premier extrait de code ci-dessus, voici:

$ 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

Une idée de ce qui se passe ici et comment puis-je me débarrasser de ce fichier fantôme?

Il s'agit d'un mac exécutant OS X si cela ajoute des informations au problème. J'utilisais sedce fichier juste avant le début de la folie.

Éditer

J'ai utilisé à la fois les drapeaux blahet les Blah lsdrapeaux sans changement de sortie apparente.

Modifier 2

Informations supplémentaires demandées dans les commentaires:

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

Plus:

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

Encore plus:

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

Remarque

La réponse ci-dessous m'a aidé à voir qu'il y avait un espace de fin dans le nom.

111 ---
la source
6
Se pourrait-il que vous ayez un espace de fin dans le nom?
fredtantini
Hmmm… Non, l'achèvement fera l'affaire ls test\ … Que se passera-t-il si vous utilisez ls "*tftp.list*"? ou utiliser lsavec --show-control-chars?
fredtantini
1
Pouvez-vous exécuter quelque chose comme echo tftp* | xxdou un autre hexdump?
choroba
2
Quelle est la sortie de printf '<%q>\n' tftp*?
Chris Down
3
Étant donné que votre environnement local est en_US.UTF-8, ls -bn'affichera pas les blancs dans les noms de fichiers de manière spéciale, que ce soit au milieu ou à la fin du nom de fichier. Vous pouvez utiliser l'une des réponses (printf, echo) ou filtrer la sortie de ls avec un programme conçu pour mettre en évidence les blancs de fin tels quels -1 tftp* | cat -vet
Mark Plotnick

Réponses:

22

Vous avez soit un espace de fin, soit un système de fichiers corrompu.

Essayer

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

Cela devrait produire quelque chose comme

'tftp.plist'
'tftp.plist '

notez les guillemets et l'espace supplémentaire. S'il renvoie exactement la même chose deux fois, vous avez probablement un système de fichiers corrompu.

Essayer

ls -i tftp.plist*

cela vous donnera les numéros d'inode du fichier. S'ils sont identiques, vous avez le même fichier deux fois dans votre répertoire. Ce serait vraiment mauvais (tm), et vous devriez exécuter fsck dès que possible. Mais je doute que ce soit le problème; c'est plus probablement la chose des espaces blancs.

Wouter Verhelst
la source
Une idée de la raison pour laquelle l'espace blanc de fin n'apparaissait pas en utilisant les drapeaux bou Bavec «ls»?
111 ---
@datUser: -Bn'a rien à voir avec cela, et vous n'en montrez pas d'exemple ls -b. Cependant, avec -blahvous , vous devriez certainement avoir vu une ligne se terminant par tftp.plist \
Steve Jessop
Ouais, j'utilisais les deux bet Bne montre ni l'espace échappé ni la valeur du caractère non imprimable dans un format lisible. IMHO très étrange.
111 ---
1
Vous pouvez rediriger la sortie de lsdans un fichier, et le vérifier avec lessou un éditeur de texte ...
Laszlo Valko
1
Pour ceux qui se demandent encore, l'hexdump révèle que le nom est "tftp.plist" (c'est-à-dire l'espace de fuite).
Joshua