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

Примітка

Відповідь нижче допомогла мені побачити, що в назві був пробіл.


6
Можливо, у вас є пробіл у назві?
fredtantini

Гммм ... Ні, завершення буде робити ls test\ ... Що станеться, якщо ви використовуєте ls "*tftp.list*"? або використовувати lsз --show-control-chars?
fredtantini

1
Чи можете ви запустити щось на кшталт echo tftp* | xxdчи якийсь інший hexdump?
choroba

2
Який результат printf '<%q>\n' tftp*?
Кріс Даун

3
Оскільки ваша локальна локація en_US.UTF-8, ls -bжодним спеціальним способом не відображатиметься заголовків у назви файлів, посередині чи в кінці імені файлу. Ви можете скористатися одним із відповідей (printf, echo) або відфільтрувати висновок 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 файлу. Якщо вони однакові, у вас є один і той же файл двічі у вашому каталозі. Це було б дійсно погано (tm), і вам слід запустити fsck як можна швидше. Але я сумніваюся, що в цьому проблема; це швидше річ пробілу.


Будь-яка ідея, чому пробільний пробіл не відображається, використовуючи прапори bабо Bпрапори з "ls"?
111 ---

@datUser: -Bнічого спільного з цим не має, і ти не показуєш приклад ls -b. Однак з -blahтобою, безумовно, слід було побачити рядок, що закінчується tftp.plist \
Стів Джессоп

Так, я використовував bі те, Bі не показував пропущений простір або значення символу, що не друкується, у читаному форматі. Дуже дивна ІМХО.
111 ---

1
Ви можете перенаправити вихід lsу файл і перевірити його lessчи редактор тексту ...
Laszlo Valko

1
Для тих, хто все ще дивується, hexdump розкриває назву "tftp.plist" (тобто пробіл).
Джошуа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.