find 명령을 mv 명령과 통합하는 방법은 무엇입니까?

find 명령을 mv 명령과 통합하는 방법은 무엇입니까?

이름이 대문자로 시작하는 모든 파일을 현재 디렉터리에서 u아래의 디렉터리 로 이동하려고 합니다 ~/tmp.

이 명령을 시도했지만 find . -type f -name "*[[upper]]*" -exec mv -t ~/tmp/u
작동하지 않습니다.

답변1

당신은 매우 가깝습니다.

  1. 마크업에는 콜론을 사용해야 합니다 [[:upper:]].

  2. "*[[:upper:]]*"모든 이름을 찾을 것입니다포함하다대문자. 이름이 있는 파일만 가져오기시작대문자의 경우 "[[:upper:]]*"(첫 번째 문자 생략  *)을 사용합니다.

  3. 그냥 말하면

    find . -name '[[:upper:]]*'
    

    그럴 것이다목록이름이 대문자로 시작하는 모든 파일. 그러나 를 사용할 때는  명령에 파일 이름을 포함하도록  -exec지시해야 합니다 .find{}

    (그리고 당신은해야언제나find명령을 실행하라고 지시하기 전에 인쇄 전용 모드에서 명령, 특히 파일 시스템을 수정하는 명령을 디버그하십시오. 사용은 일반적인 디버깅 기술입니다. )-exec echo mv …

  4. 그러나 를 사용할 때는 명령을 (또는 이에 상응하는  ) 또는 로 종료 -exec해야 합니다  . (보다';'\;+매뉴얼 페이지, 또는이 질문에 대한 Stéphane Chazelas의 답변, 구별을 위해. ) 사용하고 계시기 때문에 mv -t사용하시면 됩니다  +.

그래서 마지막 명령은

find . -name '[[:upper:]]*' -exec mv -t ~/tmp/u {} +

답변2

GNU 구현 구문은 다음 mv과 같습니다.

find . -type f -name '[[:upper:]]*' -exec mv -t ~/tmp/u {} +

또는 표준적으로:

find . -type f -name '[[:upper:]]*' -exec sh -c '
   exec mv "$@" ~/tmp/u/' sh {} +

이는 파일 이름의 패턴과 일치하기 위한 것입니다.시작대문자의 경우 대문자( 대괄호 표현식 [:upper:]내부의 POSIX 문자 클래스 [...])와 그 뒤에 원하는 수의 문자( *)가 일치하도록 하려고 합니다.

find끝점이 어디인지 알려주어야 합니다 -exec some command with its args. 그건:

  • 명령이 파일당 한 번씩 실행되도록 지시하는 인수 ;(셸 명령줄에서는 따옴표로 묶어야 합니다. 예를 들어 ';', \;, ";"...는 ;모든 셸에서 특수 문자이기도 함) (이 경우 에는 명령줄 매개변수는 파일 경로로 대체됩니다.find{}
  • 또는 매개변수의 순서입니다 {} +. 하나만 있을 수 있으며 {}그 전에 와야 합니다 +. 이 경우 명령은 여러 파일에 대해 동시에 호출되고 {}파일 목록으로 대체됩니다.

마지막 으로 find다음을 실행하십시오.

  • mv -t /home/you/tmp/u ./File1 ./File2 ./dir/File3...첫 번째 경우, -t모든 소스 파일이 끝에 위치하도록 허용합니다.
  • sh -c 'mv "$@" ~/tmp/u/' sh ./File1 ./File2 ./dir/File3...POSIXly. 그렇지 않은 경우 매개변수를 마지막에 배치할 수 있도록 -t호출하여 매개변수 순서를 변경해야 합니다 . 여기서 최종 실행은 다음과 같습니다. ( 동일한 프로세스에서 일부 구현은 이미 명시적일 필요가 없는 최적화를 수행하고 있기 때문입니다 .)sh~/tmp/u/shmv ./File1 ./File2 ./dir/File3... /home/you/tmp/u/execshexec

후행은 입력을 보장하는 것 /입니다 .mv ... ~/tmp/u/mv이사 오다모델. mv a b또는 이름 ab(이동하다) 또는 b/a(이사 오다) b디렉토리인지 여부에 따라 다릅니다. 후행을 추가함으로써 /우리는 그것이 후자인지 확인합니다. 또는 적어도 b디렉터리가 아닌 경우 이름이 다음 a으로 바뀌는 대신 오류가 보고됩니다 b(do이동하다). 위 코드에서는 find파일이 하나만 발견된 경우에 대한 것입니다. (여러 파일 이동)은 항상findmv a b c이사 오다다음과 같은 작업( c디렉토리여야 함)이동하다이 경우에는 의미가 없습니다.

답변3

find . -type f -name "[A-Z]*" -exec mv  {} <destination directory> \;

관련 정보