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

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

AAA다음 명령을 사용하여 경로에 이름이 포함된 파일을 검색합니다.

find path_A -name "*AAA*"

위 명령으로 표시된 출력을 고려하여 이 파일을 다른 경로(예: )로 이동하고 싶습니다 path_B. 이러한 파일을 하나씩 이동하는 대신 find 명령 바로 다음에 이동하여 명령을 최적화할 수 있습니까?

답변1

GNU와 함께MV:

find path_A -name '*AAA*' -exec mv -t path_B {} +

이것은 각 찾기 결과를 차례로 대체하고 사용자가 제공한 명령을 실행하는 찾기 -exec옵션을 사용합니다. {}설명된 대로 man find:

   -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of `;' is encountered.  

이 예에서는 가능한 한 적은 작업을 실행하는 +버전을 사용합니다.-execmv

   -exec command {} +
          This  variant  of the -exec action runs the specified command on
          the selected files, but the command line is built  by  appending
          each  selected file name at the end; the total number of invoca‐
          tions of the command will  be  much  less  than  the  number  of
          matched  files.   The command line is built in much the same way
          that xargs builds its command lines.  Only one instance of  `{}'
          is  allowed  within the command.  The command is executed in the
          starting directory.

답변2

다음을 수행할 수도 있습니다.

find path_A -name "*AAA*" -print0 | xargs -0 -I {} mv {} path_B

어디,

  1. -0공백이나 문자(줄 바꿈 포함)가 있으면 많은 명령이 작동하지 않습니다. 이 옵션은 공백이 포함된 파일 이름을 처리합니다.
  2. -I초기 인수에서 대체 문자열을 표준 입력에서 읽은 이름으로 바꿉니다. 또한 따옴표가 없는 공백은 항목을 종료하지 않으며 대신 구분 기호는 개행 문자입니다.

시험

sourcedir과 로 두 개의 디렉토리를 만들었습니다 destdir. 이제 다음 과 같이 sourcedir여러 파일을 만듭니다.file1.bakfile2.bakfile3 with spaces.bak

이제 다음과 같이 명령을 실행합니다.

find . -name "*.bak" -print0 | xargs -0 -I {} mv {} /destdir/

이제 destdir이 작업을 수행하면 ls파일이 sourcedir에서 destdir.

인용하다

http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/

답변3

OS X 사용자가 이 문제를 더 쉽게 겪을 수 있도록 OS X의 구문이 약간 다릅니다. 다음 하위 디렉터리에서 재귀적으로 검색하고 싶지 않다고 가정해 보겠습니다 path_A.

find path_A -maxdepth 1 -name "*AAA*" -exec mv {} path_B \;

모든 파일을 재귀적으로 검색하려면 다음을 수행하십시오 path_A.

find path_A -name "*AAA*" -exec mv {} path_B \;

답변4

만 사용POSIX의 특징find(그리고아직도 속해있다mv):

find path_A -name '*AAA*' -exec sh -c 'mv "$@" path_B' find-sh {} +

추가 자료:

관련 정보