조건에 따라 "mv" 명령을 실행하는 방법 - 특정 끝이 있는 파일을 다른 폴더로 이동

조건에 따라 "mv" 명령을 실행하는 방법 - 특정 끝이 있는 파일을 다른 폴더로 이동

저는 컴퓨터 공학을 전공하는 학생입니다. 2학년이고 저는 Linux에 대해 배우고 있습니다. 코로나 때문에 독립적으로 공부하고 있어요. 공부하는 동안 여러 섹션으로 구성된 질문을 발견했습니다. 해결할 수 없습니다.

질문은 내가 mv명령을 실행하기를 원합니다. 일부 파일을 폴더로 전송하는 것입니다. 나는 mv명령을 실행하려고 시도했고 "파이프"나 find.

제 생각에는 이것은 일반적인 명령이 아닙니다 mv. 더 많은 것들이 통합되어야 하는데 어떻게 해독할 수 없는지요. 나는 며칠 동안 그 문제를 해결하려고 노력했습니다. 저도 포럼에서 이와 동일한 질문을 찾으려고 노력했지만 찾을 수 없었습니다.

질문:

  1. .c폴더 안 이나 폴더 .h로 끝나는 모든 파일을 복사하는 명령을 하나 작성하십시오 Programs.

내 시도는 아마도 그렇게했을 것입니다 :

find "*.c" -o "*.h" | mv Programs

답변1

할당은 세 가지 방식으로 해석될 수 있습니다.

  1. .c전체 및 .h파일 복사현재 디렉토리에서디렉토리로 Programs또는
  2. .c전체 및 .h파일 복사현재 디렉토리 또는 그 아래 어디에서나디렉토리에 Programs.
  3. 접근 가능한 모든 항목을 복사 .c하고.h 시스템 어디에서나디렉토리에 Programs.

할당에는 "이동"이 아니라 "복사"라고 되어 있습니다. 이는 cp가 아닌 명령을 사용해야 함을 의미합니다 mv.

과제의 첫 번째 해석은 다음과 같이 해결됩니다.

cp *.[ch] Programs

*.[ch]( 우리가 관심 있는 모든 파일과 일치하고 현재 디렉토리에 이러한 파일이 수천 개도 없다고 가정 ).

과제의 두 번째 해석은 다음과 같이 해결됩니다.

find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;

이는 현재 디렉토리 안이나 그 아래에 .c또는 파일 이름 접미사가 있는 모든 일반 파일을 검색하고 해당 파일 각각에 대해 실행합니다. 해당 유틸리티는 표준 입력 스트림을 읽지 않으므로 파이프할 수 없습니다 ..hcpcp

우리는 또한피하다디렉터리 내부를 살펴봅니다 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솔루션은 숨겨진 파일(이름이 점으로 시작하는 파일)을 복사하지만 첫 번째 솔루션은 기본적으로 이러한 유형의 이름과 일치하지 않습니다.

관련 정보