가장 좋은 방법에 대한 Stephane의 답변을보고 더 명확한 솔루션을 사용하지 않는 이유와 가장 효율적인 방법이 아닌 이유에 대한 내 대답을 살펴보십시오.
다음 -I
옵션을 사용할 수 있습니다 xargs
.
find /tmp/ -ctime -1 -name "x*" | xargs -I '{}' mv '{}' ~/play/
어떤 유사한 메커니즘으로 작동 find
하고 {}
. 또한 현재 디렉토리에서 -name
시작하는 파일 x
은 파일을 glob하고 찾기위한 인수로 전달되기 때문에 예상 한 동작을 제공하지 않기 때문에 인수를 인용합니다 .
그러나 manatwork에서 지적한대로 xargs
man 페이지에 자세히 설명되어 있습니다 .
-I replace-str
Replace occurrences of replace-str in the initial-arguments with
names read from standard input. Also, unquoted blanks do not
terminate input items; instead the separator is the newline
character. Implies -x and -L 1.
중요한 것은 -L 1
한 번에 한 줄 의 출력 만 find
처리된다는 것입니다. 이는 구문 상 다음과 동일 함을 의미합니다.
find /tmp/ -ctime -1 -name "x*" -exec mv '{}' ~/play/
( 각 파일 마다 단일 mv
작업을 실행 합니다).
GNU -0
xargs 인수와 인수를 사용하더라도 find -print0
정확히 동일한 동작이 발생 합니다 . 이는 각 파일 -I
에 clone()
대한 프로세스입니다 mv
.
find . -name "x*" -print0 | strace xargs -0 -I '{}' mv '{}' /tmp/other
.
.
read(0, "./foobar1/xorgslsala11\0./foobar1"..., 4096) = 870
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbb82fad000
open("/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26066, ...}) = 0
mmap(NULL, 26066, PROT_READ, MAP_SHARED, 3, 0) = 0x7fbb82fa6000
close(3) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fbb835af9d0) = 661
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 661
--- SIGCHLD (Child exited) @ 0 (0) ---
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fbb835af9d0) = 662
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 662
--- SIGCHLD (Child exited) @ 0 (0) ---
.
.
.
-I
: 와 함께 사용할 수find . | xargs -I'{}' mv '{}' ~/play/
있지만, 사람이 말했듯이“Implies-x
and-L 1
”. 따라서 아무런 이득이 없습니다. 더 나은은 간단하고 사용 유지find . -exec mv '{}' ~/play/ \;