ファイルを削除しようとしたときに「そのようなファイルまたはディレクトリはありません」が、ファイルは存在しますか?


21

PHPスクリプトを介してサーバーにアップロードされたpng画像を削除しようとしています。ftpと端末の両方で削除しようとすると、エラーが発生します

No such file or directory

しかし、私lsがディレクトリにいるとき、ファイルはリストされ、それは私のftpクライアントにもリストされています。同じ名前のファイルを作成しようとしましたが、同じ名前の2つのファイルが作成されました。

おそらく存在しないファイルを開くことはできますが、それでも削除することはできません。サーバーの再起動も試みました。何が問題なのでしょうか?Ubuntuの64ビットバージョンを実行していますが、32/64ビットの問題ではないと思います。また、同じPHPスクリプトによってアップロードされた他の多くのpngファイルを削除したことに注意してください。

の出力 ls -l

total 224 
-rw-r--r-- 1 www-data www-data 222838 May 13 04:14 qyxdshyikfr_fishing_timeout.png 
-rw-r--r-- 1 root root 272 May 14 06:54 upload.php

しようとしたときの出力 rm

rm: cannot remove ‘qyxdshyikfr_fishing_timeout.png’: No such file or directory

upload.php:http ://pastebin.com/z87eypTY


ls -lディレクトリからの出力、rmコマンド全体およびその出力もコピーペーストします。
heemayl

@heemayl合計224 -rw-r--r-- 1 www-data www-data 222838 5月13 04:14 qyxdshyikfr_fishing_timeout.png -rw-r--r-- 1ルートルート272 5月14 06:54 upload.php rm: 'qyxdshyikfr_fishing_timeout.png'を削除できません:そのようなファイルまたはディレクトリはありません
DevinFrench

1
@DevinFrenchは質問を編集して情報を追加してください。
ムル

どのディレクトリからrmコマンドを実行していますか?
heemayl

1
@Samuelなぜこれがファイルシステムの問題を示唆するのでしょうか?unlinkコールは常に存在しないファイルを見つけることが失敗します。そのようなファイルがないことがわかっstraceいるシステムでそのコマンドを実行すると、同様の出力が生成されます。私が示しているとは思わない私は、ファイルシステムの問題を抱えています!他の回答で示唆されているように、ファイル名の表示qyxdshyikfr_fishing_timeout.png方法の制限により、ファイルの名前はわずかに異なるだけで同じように見える可能性がはるかに高いようlsです。
エリアケイガン

回答:


21

同じ名前のファイルを作成しようとしましたが、同じ名前の2つのファイルを取得することになります。

それは2つのファイルがあることを、不在のファイルシステムの破損、と言う2人の異なる名前と同じように表示されますので、あなたの文字セット/フォントで同じように見える非印字文字や文字を。の--escapeオプションlsは、そのような場合のあなたの友人であり、のようなツールも同様cat -vです。

それもそうです rm -i -- *

参考文献


私はファイルの作成者であり、アップロードされたファイル名でした。upload.phpへの完全なパスを知っているのは私だけなので、誰も私のサーバーを妨害しようとしませんrm -i -- *でした。
-DevinFrench

3
@DevinFrenchこの回答で問題が解決した場合は、賛成票の下にあるマークをクリックして、受け入れられた回答としてマークしてください。これにより、将来のユーザーがこのソリューションが機能することを認識できます。
コス

1
誰かがrm -i -- *コマンドを説明できますか?
user3731622

私の理解から:合格-i すると、各ファイルを削除する前にプロンプ​​トが表示されます。--before *は、名前に特殊文字が含まれているかどうかに関係なく、すべてのファイルを選択します。参照:https
//explainshell.com/explain?cmd

16

TL; DR:実行しls -1b、ファイル名を見つけ、表示されている行をコピーして、それをに渡しrmます。

他の人が示唆したように、これはおそらく方法の制限によるものであり、lsクライアントおよびサーバーソフトウェアを含むいくつかの他のプログラムは、デフォルトで制御文字を含むファイルなどの奇妙なファイル名を処理します。JdeBPの回答でのあなたの成功は、これが事実であることを強く示唆していますが、それ以前にも良い賭けだったでしょう。

  • の場合ls標準出力が端末の場合、?文字はその場所に印刷されます。したがって、lsの出力を他のコマンドにパイプしない(または表示するためにログにリダイレクトする)場合、おそらくファイル名に制御文字が含まれていません。しかし、他の問題のある文字もあります。たとえば、ファイル名に末尾の空白が含まれているなどです。

    この動作はls混乱を招く可能性がありますが、バグではなく、ユーザーが明示的にオーバーライドできます(以下を参照)。

  • ファイルにリモートでアクセスまたはファイルを削除しようとすると、クライアントまたはサーバーソフトウェアのバグがこのような問題を引き起こす可能性があります。

    ftp名前に末尾のスペースが含まれるファイルの場合を含め、私はこのようなことを何度か自分で経験しました。(それが機能しなかったのは、ftpクライアントのバグが原因でした。)手動でファイルを作成した場合でも、作成方法によっては、末尾のスペースやその他の空白を誤って挿入することが非常に簡単な場合があります。スペースでなくてもスペースのように見える場合があります。

これはls -1b(またはdir -1)便利な状況です:

  • -1ls行ごとに1つのエントリを表示するように指示します。そうすれば、あるファイル名がどこで終わり、別のファイル名が始まるかについて混乱はありません。これは、奇妙な名前のファイルに便利です。
  • -bls特殊文字のエスケープシーケンスを出力するように指示します。の出力はls -b、引用符を追加することなく、文字どおりコマンドにコピーして貼り付けることができます。問題のある文字はすべて、シェルがそれらをそのまま認識するように既に引用されています。

警告が1つだけあります。行の最後の文字がのように見える場合は、スペースを引用している\ので、その後に1文字をコピー\します。

ls -1bそのように実行することも、シェルglobパターンを渡すこともできます(例:)ls -1b qyx*。グロビングは、グロブパターンに表示される名前の部分に制御文字(またはその他の奇妙な文字)が存在するかどうかによって、ファイルを検出する場合としない場合があります。

で指定された\-quotedバージョンのファイル名をコピーしたらls、これをコマンドに貼り付けることができます。手動で変更する必要はありません。あなたの場合、ファイルを削除したいのでrm、を入力し、スペースを入力し、行を貼り付けてを押しEnterます。

参考文献:


1
非常にクールな-bthx =)と+1
AB

私がOPから残したことは、同じ名前のファイルを作成したとき、問題があった最初のファイルを削除しようとしたときにftpクライアントで、作成した新しいファイルを削除することでした。だから私は特別なキャラクターが関与しているとは思わなかったし、私が使用して以来、私はまだ特別なキャラクターが何であるかを知らないrm -i -- *
-DevinFrench

@DevinFrench余分な文字は、ファイル名の末尾のスペースです。ls質問の出力にはまだありますが、「編集」をクリックするとテキストモードでのみ表示されます。
イズカタ

@Iskataいいね!私はそれをチェックすることを考えるべきだった。また、編集履歴でリビジョン3を展開したときにも表示されます(末尾のスペースを含む完全なファイル名が緑色で強調表示され、識別可能です)。あなたが言ったことはこれまでで最も決定的で具体的に正しい説明です-末尾のスペースからのものであることを説明する答えを投稿した場合、どのように知っているか、どのコマンドがファイルを削除するか(OPにまだあった場合) 、私はそれを賛成すると思います。
エリアケイガン

@EliahKagan完了、写真付き
イズカタ

3
  1. find出力を使用して確認します。

    ファイルが見つからない場合、検索用語を*qyxdshyikfr*わずかに短くします。例: *qyxds*または*fishing*

    sudo find . -maxdepth 1 -type f -name "*qyxdshyikfr*"
    
  2. よければfind、ステップ1で検索語とともに使用し、rm

    find . -maxdepth 1 -type f -name "*qyxdshyikfr*" -print0 | xargs -0  rm
    

1
むしろ呼び出しよりrmから管を介して、名前でfindxargs、私が使用して、単純にお勧めfind-deleteアクションを。またsudo、必要ありません。それほど重要ではありませんが、-type f明らかに役立つ場合を除き、省略することをお勧めします。おそらく、OPが削除したいエントリがシンボリックリンクであることが判明した場合、おそらく、彼らはそれを見つけたいが、それでも削除したいでしょう。この-deleteアクションは、ディレクトリを再帰的に上書きしません。rmあなたが持っていないのであなたの命令もしません-r。したがって、を使用しないことで、ここで(空でない)フォルダー全体を誤ってたたくことはありません-type
エリアケイガン

OK、ちょっと待ってください。
AB

私の場合、find ... -delete「削除できません...そのようなファイルまたはディレクトリはありません」とさえ言う
ハーミングモニカを停止

1

Eliahの回答に対する私のコメントから拡大した詳細な再投稿

この問題は目に見えませんが、何を探すべきか知っていれば見ることができます:ファイル名には最後にスペースが含まれています。ls出力全体をコピー/貼り付けたため、出力を強調表示したり、投稿を編集してカーソルを最後に移動したり、(エリアが指摘したように)編集履歴の差分を確認したりすると、質問に表示されます。lsこのスクリーンショットの投稿で出力を強調しました:

余分なスペース

コメント付きで問題を再現するための簡単な短いターミナルセッション:

$ touch 'foo '        # Create file with a space at the end
$ ls -l               # Space is not visible in ls output
total 0
-rw-rw-r-- 1 izkata izkata 0 May 14 21:59 foo 

$ rm foo              # Cannot remove it when not specifying the space
rm: cannot remove ‘foo’: No such file or directory

$ rm 'foo '           # Can remove it if we quote the file name and include the space
$ rm foo\             # Or can escape the space to tell bash to include it as part of the filename

bashはスペースを正しくエスケープするのに十分な賢さなので、タブ補完を使用してもこの問題は完全に回避されます(一般的には良い習慣であり、パスを非常に高速に入力できます)

たとえば、入力した場合、上のコードブロックの最後の例のように、にrm f<tab>自動補完rm foo\<space><space>されます。


lsStackOverflowで同様のことが一度起こったので、出力のコピー/貼り付けについて特別に言及します(これが私がこれを探すと思った全体の理由です):誰かがコードに印刷できない文字を取得し、誰もがそれを理解した唯一の理由質問投稿する際に、そのユーザーが代わりの貼り付け/コピーためで、コードを再入力する
Izkata

0

一度、ルートとしてNautilusを開くファイルを作成しましたが、nautilusから見たときのファイル名は「File Browser(root)」でした。

$ rm "File Browser (Root)"
$ sudo rm "File Browser (Root)"
$ sudo rm "File Browser (Root).desktop"

私が手に入れた唯一のanwserは、「rm: 'File Browser(Root).desktop'を削除できません:そのようなファイルまたはディレクトリはありません」

その後、実行すると:

$ ls -l

実際に、ファイル名が「Nautilus-root.desktop」であることを見た/思い出した

だから私は実行します:

$ sudo rm "Nautilus-root.desktop"

私のために働いた、それが役立つことを願っています!


0

だから私はこの問題を抱えていて、これらのことはどれもうまくいきませんでした。うまくいったのは、まったく同じ名前のファイルを作成することでした。Example.1.2.3という名前のフォルダーだったため、新しいフォルダーを作成し、削除しないフォルダーとまったく同じ名前を付けました。古いフォルダが消え、新しいフォルダを削除しました。


0

MacでPicturesディレクトリrsyncをバックアップし、Ubuntuでそれを読んだ後、同様の状況がありました。異なる名前の2つのファイル(実際にはディレクトリ)がありましたが、内容は同じです。1つを(Nautilusを使用して)ゴミ箱から削除しましたが、コマンドラインからでも削除できませんでした。それは言うでしょう:

$ rmdir Pictures
rmdir: failed to remove 'Pictures': No such file or directory
$ rm Pictures
rm: cannot remove 'Pictures': Is a directory

ls -i -lでiノード番号を確認した後、両方のディレクトリに同じiノード番号があることがわかりました。ハードリンクのように見えます...

解決策は驚くほど簡単でした-アイコンを右クリックしてゴミ箱を空にしました。その後、両方のディレクトリがなくなりました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.