저는 컴퓨터 공학을 전공하는 학생입니다. 2학년 - 저는 리눅스를 배우고 있어요. 코로나바이러스로 인해 독립적으로 공부하고 있습니다. 공부하는 동안 저는 여러 부분에 관한 문제를 발견했습니다. 저는 그것을 해결할 수 없었습니다.
질문은 내가 mv
명령을 실행하기를 원합니다. 일부 파일을 이 폴더로 전송하십시오. 해당 명령을 실행해 보았고 mv
"파이프" 또는 find
.
제 생각에는 이것은 일반적인 mv
명령이 아니며 더 많은 것을 통합해야 할 것 같고 해독할 수 없습니다. 나는 이 문제를 해결하기 위해 며칠 동안 노력했습니다. 저도 포럼에서 비슷한 질문을 찾으려고 노력했지만 찾을 수 없었습니다.
질문:
- 이 폴더
.c
로 끝나는 모든 파일을 복사하는 명령을 작성하십시오..h
Programs
내 시도는 다음과 같습니다.
find "*.c" -o "*.h" | mv Programs
답변1
이 할당은 세 가지 방식으로 해석될 수 있습니다.
.c
전체 및.h
파일 복사현재 디렉토리에서디렉토리로Programs
또는.c
전체 및.h
파일 복사현재 디렉토리 또는 그 아래 어디에서나디렉토리에Programs
.- 접근 가능한 모든 항목을 복사
.c
하고.h
시스템 어디에서나디렉토리에Programs
.
할당에는 "이동"이 아니라 "복사"라고 되어 있습니다. 이는 cp
대신 이 명령을 사용해야 함을 의미합니다 mv
.
과제에 대한 첫 번째 설명은 다음과 같이 해결됩니다.
cp *.[ch] Programs
( *.[ch]
관심 있는 모든 파일이 일치하고 현재 디렉터리에 수천 개의 파일이 없다고 가정합니다.)
과제의 두 번째 해석은 다음과 같이 해결됩니다.
find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;
이는 현재 디렉토리 내 또는 그 아래에 .c
또는 파일 이름 접미사가 있는 모든 일반 파일을 검색하고 그러한 각 파일에서 실행됩니다. 유틸리티가 표준 입력 스트림을 읽지 않기 때문에 파이프를 통해 연결할 수 없습니다..h
cp
cp
우리는 또한 보장합니다피하다디렉터리 내부를 살펴봅니다 Programs
(현재 디렉터리 내의 하위 디렉터리라고 가정). 그렇게 하지 않으면 결국 .see 에서 파일이 Programs
복사 됩니다 ."Programs
find의 -path 및 -prune 옵션 설명" -path
및 에 대한 자세한 내용은 -prune
.
세 번째 해석은 두 번째 해석에서 쉽게 이어집니다.
find / -path "$PWD/Programs" -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;
find
... 디렉토리 트리의 맨 위에서 시작하여 Programs
피해야 할 디렉토리가 경로에 있는 디렉토리임을 지정하면 됩니다 $PWD/Programs
.
모든 곳에 접근할 수 없기 때문에 많은 오류가 발생할 수 있습니다. 이를 방지하려면 액세스할 수 없는 디렉터리도 삭제하고 읽을 수 있는 파일만 복사하세요.
find / \( -type d ! -executable -o -path "$PWD/Programs" \) -prune -o \
-type f -name '*.[ch]' -readable -exec cp {} Programs \;
이를 find
위해서는 -executable
테스트(디렉토리가 실행 가능한 경우 디렉터리는 검색 가능함) 및 -readable
테스트를 위해 GNU가 필요합니다.
find
여기서 변형은 파일을 일반 파일( test 통과)로 제한하는 반면 -type f
, 이 cp *.[ch]
메서드는 해당 두 문자로 끝나는 모든 유형의 콘텐츠를 복사합니다. 또한 이 find
솔루션은 숨겨진 파일(이름이 점으로 시작하는 파일)을 복사하는 반면, 첫 번째 솔루션은 기본적으로 이러한 유형의 이름과 일치하지 않습니다.