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.
이 예에서는 가능한 한 적은 작업을 실행하는 +
버전을 사용합니다.-exec
mv
-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
어디,
-0
공백이나 문자(줄 바꿈 포함)가 있으면 많은 명령이 작동하지 않습니다. 이 옵션은 공백이 포함된 파일 이름을 처리합니다.-I
초기 인수에서 대체 문자열을 표준 입력에서 읽은 이름으로 바꿉니다. 또한 따옴표가 없는 공백은 항목을 종료하지 않으며 대신 구분 기호는 개행 문자입니다.
시험
sourcedir
과 로 두 개의 디렉토리를 만들었습니다 destdir
. 이제 다음 과 같이 sourcedir
여러 파일을 만듭니다.file1.bak
file2.bak
file3 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 {} +
추가 자료: