이 사용 사례에서 grep 및 cp를 사용하여 파이프 찾기를 올바르게 수행하는 방법

이 사용 사례에서 grep 및 cp를 사용하여 파이프 찾기를 올바르게 수행하는 방법

패턴에 대한 디렉터리에서 문자열을 재귀적으로 파악한 다음 일치하는 파일을 대상 디렉터리로 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에 대한 자리 표시자를 지정할 수 있습니다 .xargsxargs -I '{}' cp '{}' /dest/dir

또한 find재귀를 처리하므로 가 grep필요하지 않습니다 -R.

마지막 해결책:

find . -type f -exec grep -il "MY PATTERN" '{}' + | xargs -I '{}' cp '{}' /dest/dir

답변4

위의 예 중 어느 것도 의 중복된 결과(이름은 같지만 위치가 다른 파일)가 생성될 grep가능성 을 고려하지 않았 으므로 의 후크가 대상 디렉토리의 파일을 덮어씁니다 .-lfindexec

이 문제를 해결하려는 시도:

$ 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

관련 정보