
패턴에 대한 디렉터리에서 문자열을 재귀적으로 파악한 다음 일치하는 파일을 대상 디렉터리로 cp'ing하는 데 관심이 있습니다. 나는 다음과 같은 일을 할 수 있다고 생각했지만 Linux의 찾기 도구로는 이해가 되지 않는 것 같습니다.
find . -type f -exec grep -ilR "MY PATTERN" | xargs cp /dest/dir
이 문제를 해결하는 더 좋은 방법이 있나요? 아니면 효과가 있는 방식이 확실한 시작이 될 수도 있습니다.
답변1
해보고 깃발 man xargs
을 보세요 -I
.
find . -type f -exec grep -ilR "MY PATTERN" {} \; | xargs -I % cp % /dest/dir/
또한 플래그 뒤에는 또는가 find
있어야 합니다 .\;
+
-exec
답변2
내 생각엔 당신이 찾을 필요가 없을 것 같아요. 재귀 grep:
grep -rl "MY PATTERN" .
답변3
xargs
표준 입력을 읽고 이를 실행할 명령 끝에 넣습니다. 당신이 쓴대로, 당신은 결국 실행하게 될 것입니다
cp /dest/dir sourcefile1 sourcefile2 sourcefile3
당신이 원하는 것과 반대입니다.
옵션을 사용하여 다음과 같이 -I
에 대한 자리 표시자를 지정할 수 있습니다 .xargs
xargs -I '{}' cp '{}' /dest/dir
또한 find
재귀를 처리하므로 가 grep
필요하지 않습니다 -R
.
마지막 해결책:
find . -type f -exec grep -il "MY PATTERN" '{}' + | xargs -I '{}' cp '{}' /dest/dir
답변4
위의 예 중 어느 것도 의 중복된 결과(이름은 같지만 위치가 다른 파일)가 생성될 grep
가능성 을 고려하지 않았 으므로 의 후크가 대상 디렉토리의 파일을 덮어씁니다 .-l
find
exec
이 문제를 해결하려는 시도:
$ tree foo
foo
├── bar
│ ├── baz
│ │ └── file
│ └── file
├── destdir
└── file
3 directories, 3 files
$ while read a; do mv $a foo/destdir/$(basename $a).$RANDOM; done < <(grep -rl content foo)
$ tree foo
foo
├── bar
│ └── baz
└── destdir
├── file.10171
├── file.10842
└── file.25404
3 directories, 3 files