나는 find . -type f -print0 | xargs -0 sh -c
이와 같은 일련의 명령을 실행하는 데 사용합니다
find . -type f \
exec grep -q `filter` \
-print0 | xargs -0 sh -c '
sed -i.bak s/this/that/g ${0}
git diff --no-index /path/to/${0}.bak /path/to/${0} >> my.patch
rm ${0}.bak
'
검색 및 바꾸기, 백업, 패치, 백업 삭제처럼 보였지만 패치 파일을 살펴보니 대부분의 변경 사항이 없었기 때문에 다른 접근 방식을 시도했습니다.
find . -type f \
exec grep -q `filter` \
-print0 | xargs -0 sed -i.bak s/this/that/g {} \;
그 후 .bak
모든 파일을 백업 폴더로 옮겼는데 이번에는 파일이 많이 바뀌었고 백업 폴더와 소스 폴더를 기반으로 생성된 패치 파일도 훨씬 커진 것을 볼 수 있었습니다
나는 두 번째 접근 방식에 동의합니다. 첫 번째 접근 방식에서 내가 어디에서 잘못하고 있는지 알고 싶습니다. 모든 명령이 내부에서 실행되지 않는 이유는 무엇입니까 sh -c
? 감사해요!
답변1
xargs
가능한 한 많은 인수를 사용하여 명령을 실행하려고 시도하지만 그 중 하나만 사용합니다. 다음과 같은 것이 모든 매개변수를 처리합니다.
xargs -0 sh -c '
for i
do
sed -i.bak s/this/that/g "$i"
git diff --no-index /path/to/"$i".bak /path/to/"$i" >> my.patch
rm "$i".bak
done
' _
for i
(또는 for i in "$@"
)는 각 인수( 제외)를 반복하므로 대신 be와 같은 것을 사용하고 전혀 사용하지 않는 $0
것이 더 쉽습니다 ._
$0
$0