'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

Любая идея, что здесь происходит и как я могу избавиться от этого файла-призрака?

Это Mac под управлением OS X, если это добавляет какую-либо информацию к проблеме. Я использовал sedэтот файл как раз перед тем, как началось безумие.

редактировать

Я использовал оба , blahи на Blah 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"

Заметка

Ответ ниже помог мне понять, что в названии был пробел.

111 ---
источник
6
Может быть, у вас в конце есть пробел?
Фредантини
Хм ... Нет, завершение будет делать ls test\ ... Что произойдет, если вы используете ls "*tftp.list*"? или использовать lsс --show-control-chars?
Фредантини
1
Можете ли вы запустить что-то вроде echo tftp* | xxdили какой-нибудь другой hexdump?
Чороба
2
Какой выход printf '<%q>\n' tftp*?
Крис Даун
3
Поскольку ваша локаль есть en_US.UTF-8, ls -bне будет показывать пробелы в именах файлов каким-либо особым образом, будь то в середине или в конце имени файла. Вы можете использовать один из ответов (printf, echo) или отфильтровать вывод ls с помощью программы, предназначенной для выделения конечных пробелов, такой какls -1 tftp* | cat -vet
Марк Плотник,

Ответы:

22

У вас либо завершающий пробел, либо повреждена файловая система.

Пытаться

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

Это должно вывести что-то вроде

'tftp.plist'
'tftp.plist '

обратите внимание на кавычки и дополнительное место. Если он выводит одно и то же дважды, вероятно, у вас поврежденная файловая система.

Пытаться

ls -i tftp.plist*

это даст вам номера инодов файла. Если они одинаковые, у вас есть один и тот же файл дважды в вашем каталоге. Это было бы действительно плохо (тм), и вы должны запустить fsck как можно скорее. Но я сомневаюсь, что это проблема; это скорее пустое место.

Воутер Верхелст
источник
Есть идеи, почему замыкающий пробел не показывался с помощью bили Bфлагов с 'ls`?
111 ---
@datUser: -Bэто не имеет ничего общего, и вы не показываете пример ls -b. Тем не менее, с -blahвами наверняка следовало бы увидеть строку, заканчивающуюся tftp.plist \
Стив Джессоп
Да, я использовал bи то, Bи другое, и ни один из них не отображал пробел или значение непечатного символа в читаемом формате. Очень странно ИМХО.
111 ---
1
Вы можете перенаправить вывод lsв файл и проверить его с помощью lessили текстового редактора ...
Ласло Валко
1
Для тех, кто все еще задается вопросом, hexdump показывает имя "tftp.plist" (то есть, конечный пробел).
Джошуа