"mv" 명령을 조건부로 실행하는 방법 - 특정 끝을 가진 파일을 다른 폴더로 이동

"mv" 명령을 조건부로 실행하는 방법 - 특정 끝을 가진 파일을 다른 폴더로 이동

저는 컴퓨터 공학을 전공하는 학생입니다. 2학년 - 저는 리눅스를 배우고 있어요. 코로나바이러스로 인해 독립적으로 공부하고 있습니다. 공부하는 동안 저는 여러 부분에 관한 문제를 발견했습니다. 저는 그것을 해결할 수 없었습니다.

질문은 내가 mv명령을 실행하기를 원합니다. 일부 파일을 이 폴더로 전송하십시오. 해당 명령을 실행해 보았고 mv"파이프" 또는 find.

제 생각에는 이것은 일반적인 mv명령이 아니며 더 많은 것을 통합해야 할 것 같고 해독할 수 없습니다. 나는 이 문제를 해결하기 위해 며칠 동안 노력했습니다. 저도 포럼에서 비슷한 질문을 찾으려고 노력했지만 찾을 수 없었습니다.

질문:

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

내 시도는 다음과 같습니다.

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(현재 디렉터리 내의 하위 디렉터리라고 가정). 그렇게 하지 않으면 결국 .see 에서 파일이 Programs복사 됩니다 ."Programsfind의 -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솔루션은 숨겨진 파일(이름이 점으로 시작하는 파일)을 복사하는 반면, 첫 번째 솔루션은 기본적으로 이러한 유형의 이름과 일치하지 않습니다.

관련 정보