서로 다른 두 파일의 문자열을 하나의 명령으로 바꿀 수 있나요?

서로 다른 두 파일의 문자열을 하나의 명령으로 바꿀 수 있나요?

일부 하위 디렉터리가 있는 디렉터리가 있습니다. 예를 들어 *A*.txt*B*.txt"를 포함하는 두 가지 유형의 파일이 있다는 것을 알고 있습니다.오래된 문자열"를 해당 디렉토리에 넣습니다. 해당 디렉토리를 "로 바꾸고 싶습니다.새 문자열". 하나의 명령으로 이 작업을 수행할 수 있습니까? 즉, "*B*.txt"이 명령의 어딘가에 다음을 추가할 수 있습니다.

find . -type f -name "*A*.txt" -exec sed -i 's/oldString/newString/g' {} \;

답변1

당신은 시도 할 수 있습니다:

find . -type f \( -name "*A*.txt" -o -name "*B*.txt" \) \
  -exec sed -i 's/oldString/newString/g' {} +

( 여기에서는 파일당 하나의 호출을 실행 하지 않기 +위해 대체도 사용됩니다 . 추가 이점은 다음과 같습니다.;sed어느호출이 sed0이 아닌 종료 상태로 반환됩니다.

답변2

그것이 사실이라면오직하나편지, 다음과 같이 할 수 있습니다.

find . -type f -name "*[AB]*.txt" -exec sed -i 's/oldString/newString/g' {} \;

명확히 말하면 이는 단일 문자를 일치 항목으로 사용하는 경우에만 작동합니다.

답변3

GNU가 있다면 대신에 다음과 같은 작업을 수행 find할 수 있습니다 .-regex-name

find . -type -f -regextype egrep -regex "(.*A.*|.*B.*)\.txt" -exec sed -i 's/oldString/newString/g' {} \;

노트패턴이 파일의 디렉터리 경로에도 나타날 수 있는 경우 정규식을 수정해야 합니다(@StéphaneChazelas의 설명에 따라).

-regex ".*(A|B)[^/]*\.txt"

/패턴 뒤에 표시되는 항목은 모두 제외됩니다 .

다음을 사용하여 정규식 유형을 egrep사용할 수 있는지 확인할 수 있습니다.

find -regextype help

관련 정보