ディレクトリ内の2つの同一ファイルを示す「ls」


14

だからどういうわけか、コマンドlsはディレクトリ内の2つの同一のファイルを表示しているようです。

$ 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

ファイルの1つを移動、名前変更、編集などできますが、もう1つはそこにあるようにも見えません。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

うーん...いいえ、完了しls test\ ます...使用するとどうなりますls "*tftp.list*"か またはとls一緒に使用し--show-control-charsますか?
fredtantini

1
次のような、echo tftp* | xxdまたは他のhexdump を実行できますか?
チョロバ

2
の出力はprintf '<%q>\n' tftp*何ですか?
クリスダウン

3
あなたのロケールがあるのでen_US.UTF-8ls -b途中でまたはファイル名の末尾のかどうか、任意の特別な方法でファイル名に空白が表示されません。あなたは答えの一つ(のprintf、エコー)、またはフィルタのようなハイライト末尾の空白に設計されたプログラムでのlsの出力を使用することができますls -1 tftp* | cat -vet
マークPlotnick

回答:


22

末尾に空白があるか、ファイルシステムが破損しています。

試してみる

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

それは次のようなものを出力するはずです

'tftp.plist'
'tftp.plist '

引用符と余分なスペースに注意してください。まったく同じものを2回出力する場合は、ファイルシステムが破損している可能性があります。

試してみる

ls -i tftp.plist*

これにより、ファイルのiノード番号がわかります。それらが同じ場合、ディレクトリに同じファイルが2回あります。それはReally Bad(tm)であり、fsckをできるだけ早く実行する必要があります。しかし、私はそれが問題だとは思いません。空白の可能性が高いです。


'ls`でbor Bフラグを使用して末尾の空白が表示されなかった理由は何ですか?
111 ---

@datUser:これ-Bとは何の関係もありませんls -b。また、の例を示していません。ただし、-blahtftp.plist \で終わる行が表示されるはずです
スティーブジェソップ

ええ、私は両方bを使用しBていましたが、エスケープされたスペースも非印刷文字の値も読み取り可能な形式で表示しませんでした。非常に奇妙な私見。
111 ---

1
の出力をlsファイルにリダイレクトしless、テキストエディターまたはテキストエディターで確認することができます...
Laszlo Valko

1
まだ不思議に思う人のために、hexdumpは名前が "tftp.plist"(つまり、末尾のスペース)であることを明らかにしています。
ジョシュア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.