저는 컴퓨터 공학을 전공하는 학생입니다. 2학년이고 저는 Linux에 대해 배우고 있습니다. 코로나 때문에 독립적으로 공부하고 있어요. 공부하는 동안 여러 섹션으로 구성된 질문을 발견했습니다. 해결할 수 없습니다.
질문은 내가 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
(현재 디렉터리의 하위 디렉터리로 가정). 그렇게 하지 않으면 결국 파일이 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
위해 GNU가 필요합니다 .-executable
-readable
여기의 변형 find
은 (테스트를 통해) 파일을 일반 파일로만 제한하는 -type f
반면, cp *.[ch]
접근 방식은 해당 두 문자로 끝나는 모든 유형을 복사합니다. 또한 find
솔루션은 숨겨진 파일(이름이 점으로 시작하는 파일)을 복사하지만 첫 번째 솔루션은 기본적으로 이러한 유형의 이름과 일치하지 않습니다.