ls *.* は、「*.*: そのファイルまたはディレクトリがありません」というメッセージを提供します。

ls *.* は、「*.*: そのファイルまたはディレクトリがありません」というメッセージを提供します。

私はLinux Application Server 3.2.0-4-amd64#1 SMP Debian 3.2.41-2+deb7u2 x86_64 GNU / Linuxを使用しています。name1.php、、、name1.htmlなどという名前の複数のファイルを含むname2.phpディレクトリに移動し、次のように入力します。

$ sudo ls *.*

私は得る:

ls: cannot access *.*: No such file or directory

私は同じ問題がありますgrep

$ grep "TOS.html" *.*
grep: *.*: No such file or directory

なぜそんなことですか?この問題をどのように解決できますか?

編集#1:

$ shopt | grep glob
+ grep glob
+ shopt
dotglob         off
extglob         on
failglob        off
globstar        off
nocaseglob      off
nullglob        off

編集#2:

$ ls -ld;echo --;sudo ls -ld 
+ ls --color=auto -ld
drwxr-x--x 16 www-data root 12288 Oct 10 17:08 .
+ echo --
--
+ sudo ls -ld
drwxr-x--x 16 www-data root 12288 Oct 10 17:08 .

答え1

背景

あなたの問題は、最終的にディレクトリに対する次の権限によって引き起こされると思います。

drwxr-x--x 16 www-data root 12288 Oct 10 17:08 .

所有者(www-data)とグループ(root)にはそれぞれとrwxがありますr-x。ただし、他の権限はにのみ設定されています--x

つまり、このディレクトリからコマンドを実行できますが、このディレクトリの内容の一覧を読み取ったり実行したりすることはできません。

あなたのシナリオ

このディレクトリでコマンドを実行すると、www-data他のユーザーになります。sudoこのユーザーをUserXと呼びます。

シェルがこのコマンドをUserXとして呼び出す場合:

$ sudo ls *.*

そして、次を返します。

ls: cannot access *.*: No such file or directory

UserXのシェルはすべてのファイルに拡張しようとします*.*が、UserXはこのディレクトリの内容を読み取ることができないため、何も返しません。次に、名前がどのテキストファイルとも一致しない*.*テキストを送信します。sudo ls *.**.*

コマンドを実行しようとするとgrep同じ問題が発生します。同様に、UserXはどのファイルも読み取れないため、grepテキストファイルを検索するように指示します*.*が、その名前のファイルを見つけることができません。したがって、メッセージは次のようになります。

アクセス不可:対応するファイルやディレクトリはありません。

そして

:対応するファイルやディレクトリはありません。

はい

あなたと同様に、次の設定があるとします。

$ sudo chown nginx.root /tmp/afolder
$ sudo chmod 751 /tmp/afolder/
$ sudo ls -ld /tmp/afolder/
drwxr-x--x 2 nginx root 4096 Nov 23 04:10 /tmp/afolder/
$ sudo touch /tmp/afolder/fakefile.txt

それでは、私の場合は「UserX」で作成しましょうsaml

$ id
uid=500(saml) gid=501(saml) groups=501(saml)

次のディレクトリにCDを移動できます。

$ pwd
/tmp/afolder

ただし、そのディレクトリのファイルを一覧表示しようとすると、次のようになります。

$ ls *
ls: cannot access *: No such file or directory

同じ質問sudo:

$ sudo ls -l *.*
ls: cannot access *.*: No such file or directory

一重引用符で保護された拡張機能を使用してシェルを呼び出すと、目的の*結果が得られます。

$ sudo bash -c 'ls -l *.*'
-rw-r--r-- 1 root root 0 Nov 23 04:14 fakefile.txt

答え2

これは働きます:

sudo sh -c 'ls -l *.*'

関連情報