오늘(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
.
디렉토리를 나열하고 하나의 항목으로 표시하지 않으려면 -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가 실행되기 전에도 쉘은 별표를 해석하여 패턴과 일치하는 파일 이름 목록으로 대체합니다. 이제 일치하는 이름이 하나만 있는 경우(예: /usr/lib/valgrind
) 물론 목록에는 해당 이름만 포함됩니다. 따라서 실행되는 실제 명령은 다음과 같습니다.
ls -al /usr/lib/valgrind
이제 ls는 매개변수가 주어졌음을 확인하고 해당 단일 매개변수를 조사하면 그것이 디렉토리임을 알 수 있습니다. 해당 옵션을 제공하지 않았으므로 -d
디렉토리 이름의 경우 디렉토리 항목이 나열되지 않고 디렉토리 내용이 나열됩니다. 그리고 단지 주어진 이후로하나의디렉토리 이름을 사용하는 경우 디렉토리 이름을 먼저 인쇄하지 않습니다(단일 디렉토리 이름을 인수로 제공하면 나열된 파일이 어느 디렉토리에 속하는지 의심할 여지가 없기 때문입니다. ls
디렉토리 이름이 다음에서 유래했는지 전혀 알 수 없습니다 . 파일 이름 확장자).
디렉토리의 실제 이름을 알고 싶다면(리터럴은 /usr/lib/valgrind
추측임을 기억하세요(비록 하나일 수도 있지만 )일 수도 있음 /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
(아마도 다른 쉘에서도 마찬가지지만 확실하지는 않습니다) 처음 두 명령을 다음과 같이 단순화할 수 있습니다.
ls -ld /usr/lib/{,.}*valgrind*
각기
ls -la /usr/lib/{,.}*valgrind*