今日(Linuxを含むデバイス上で)経験している問題は、いくつかのファイル(特にValgrind/usr/lib
ファイル)が非常に奇妙に動作してコピーできないことですscp
(エラーはnot a regular file
:)。
だから:
$ ls -al /usr/lib/*valgrind*
drwxr-xr-x 2 root root 4096 Sep 30 00:01 .
drwxr-xr-x 24 root root 12288 Sep 30 00:00 ..
-rwxr-xr-x 1 root root 1816444 Jun 6 2014 cachegrind-x86-linux
-rwxr-xr-x 1 root root 1910732 Jun 6 2014 callgrind-x86-linux
-rw-r--r-- 1 root root 28429 Jun 6 2014 default.supp
-rwxr-xr-x 1 root root 1884080 Jun 6 2014 drd-x86-linux
-rwxr-xr-x 1 root root 1770688 Jun 6 2014 exp-bbv-x86-linux
-rwxr-xr-x 1 root root 1852668 Jun 6 2014 exp-ptrcheck-x86-linux
-rwxr-xr-x 1 root root 1910200 Jun 6 2014 helgrind-x86-linux
-rwxr-xr-x 1 root root 1778880 Jun 6 2014 lackey-x86-linux
-rwxr-xr-x 1 root root 1792524 Jun 6 2014 massif-x86-linux
-rwxr-xr-x 1 root root 1942904 Jun 6 2014 memcheck-x86-linux
-rwxr-xr-x 1 root root 1766560 Jun 6 2014 none-x86-linux
-rwxr-xr-x 1 root root 2620 Jun 6 2014 vgpreload_core-x86-linux.so
-rwxr-xr-x 1 root root 65296 Jun 6 2014 vgpreload_drd-x86-linux.so
-rwxr-xr-x 1 root root 17904 Jun 6 2014 vgpreload_exp-ptrcheck-x86-linux.so
-rwxr-xr-x 1 root root 37908 Jun 6 2014 vgpreload_helgrind-x86-linux.so
-rwxr-xr-x 1 root root 15128 Jun 6 2014 vgpreload_massif-x86-linux.so
-rwxr-xr-x 1 root root 26652 Jun 6 2014 vgpreload_memcheck-x86-linux.so
まず、名前に "valgrind"文字列がないことに注意してください。
その後、通常のファイル(パイプやデバイスではありません)として表示されます。しかし、非常に奇妙なことに、簡単な方法では見つけることができませんls
。
$ ls -al /usr/lib/memcheck-x86-linux
ls: /usr/lib/memcheck-x86-linux: No such file or directory
一般リストにも表示されません。
$ ls -al /usr/bin
(snipped)
Linuxでこれらの動作が発生する原因は何ですか?
また、デバイスには「ファイル」のようなユーティリティはありませんが、これが私に多くの役に立つかどうか疑問です。
出力df
:
$ df
Filesystem 1024-blocks Used Available Use% Mounted on
/dev/root 980308 175548 754964 19% /
tmpfs 10240 112 10128 1% /dev
tmpfs 246728 0 246728 0% /tmp
tmpfs 2048 12 2036 1% /var/log
tmpfs 246728 128 246600 0% /dev/shm
tmpfs 246728 0 246728 0% /run
tmpfs 246728 20 246708 0% /var/run
だから/
デバイスです。
そして:
$ whoami
root
だから私は根です。
パズルを完成させるには:
$ ls -al /dev/root
ls: /dev/root: No such file or directory
したがって、マッピングされたデバイスは実際には存在しません。
答え1
この出力は次のようになります。
$ ls -al /usr/lib/*valgrind*
drwxr-xr-x 2 root root 4096 Sep 30 00:01 .
drwxr-xr-x 24 root root 12288 Sep 30 00:00 ..
-rwxr-xr-x 1 root root 1816444 Jun 6 2014 cachegrind-x86-linux
これは、名前付きディレクトリを一覧表示していることを意味します/usr/lib/*valgrind*
(おそらくただ/usr/lib/valgrind
)。最大の手がかりは、および.
に表示されるディレクトリエントリです..
。
これはls -al /usr/lib/memcheck-x86-linux
、ファイルが存在しないと言う理由を説明します。ファイルが呼び出されるためです/usr/lib/valgrind/memcheck-x86-linux
。
ディレクトリを一覧表示し、1つのエントリとして表示したくない場合は、次に-d
フラグを追加しますls
。
$ ls -ald /usr/lib/*valgrind*
drwxr-xr-x 2 root root 4096 Sep 30 00:01 /usr/lib/valgrind
scp
コマンドラインや出力を提供していないため、「一般ファイルではない」と表示される理由はscp
推測する必要がありますが、私の考えでは、これはファイルではscp
なくパラメータに対して生成する出力のようです。単にそれが存在しないので、ある種の。
答え2
マイケル・ホーマー(Michael Homer)が書いた文だが何起こった、ここにあるなぜそのようなことが起こります(彼の答えに対するあなたの意見を考慮すると、あなたはすでに知っていると仮定しますが、この問題を抱えている他の人はそうではないかもしれません)。
あなたが下した命令は
ls -al /usr/lib/*valgrind*
ls が実行される前に、シェルはアスタリスクを解釈し、パターンに一致するファイル名のリストに置き換えます。一致する名前が1つしかない場合(例/usr/lib/valgrind
:)、もちろんリストにはその名前だけが含まれます。したがって、実行される実際のコマンドは次のようになります。
ls -al /usr/lib/valgrind
これで、lsはパラメータが与えられたことを確認し、その単一のパラメータを調べると、それがディレクトリであることがわかります。そのオプションが指定されていないため、-d
ディレクトリ名の場合、ディレクトリエントリはリストされず、ディレクトリの内容がリストされます。そしてただ与えられたので一つディレクトリ名を使用している場合は、最初にディレクトリ名を印刷しません(単一のディレクトリ名を引数として指定すると、リストされたファイルがどのディレクトリに属しているのか疑問に思わないためですls
。ファイル名拡張子)。
ディレクトリの実際の名前を知りたい場合(リテラルは推測であることを覚え/usr/lib/valgrind
ておいてください(たとえ1つかもしれません)/usr/lib/valgrind-3.7
)、次のものを使用できます。
ls -ald /usr/lib/*valgrind*
.valgrind
また、追加の隠しディレクトリまたは隠しファイル(たとえば.valgrind-foo
)/usr/lib
がある場合いいえls
-a
シェル拡張は、ユーザーが提供したオプションに興味がなく、そのファイルがファイルリストに含まれていないため、そのファイルも表示したいとは思わないため、オプションにもかかわらずコマンドls
によってls
引き続き表示されます。したがって、ドットファイルもリストされていることを確認するには、次のものを使用する必要があります。
ls -ld /usr/lib/*valgrind* /usr/lib/.*valgrind*
-a
これはいいえ引数として与えられたポイントファイルはに無条件にリストされているので、ここで必要ですls
。もちろん、valgrind
ドットファイルを含む名前に含まれるディレクトリの内容を一覧表示するには〜する-a
これらのドットファイルは、拡張後にコマンドラインに表示されないために必要です。つまり、この場合は次を使用します。
ls -la /usr/lib/*valgrind* /usr/lib/.*valgrind*
一方、一致するディレクトリの内容には興味がありますが、.*valgrind*
その中に含まれるドットファイルには興味がない場合は使用されません-a
。
使用している場合bash
(おそらく他のシェルでも同じですがわかりません)、最初の2つのコマンドを次のように単純化できます。
ls -ld /usr/lib/{,.}*valgrind*
それぞれ
ls -la /usr/lib/{,.}*valgrind*