find -exec에서 하위 문자열 제거

find -exec에서 하위 문자열 제거

그것을 사용할 때

$ find . -name string~ -exec cp {} FOO \;

bash 하위 문자열에서 일반적으로 수행하는 것처럼 {}in을 사용하여 물결표 문자를 제거하는 방법이 있습니까?FOO

예를 들어:

 $ echo ${string%substring}

내 목표는 string~이라는 파일을 string에 복사하는 것입니다(그 반대도 마찬가지 $ find . -name string -exec cp {} {}~ \;).

답변1

이 경우 결과 셸을 코드 실행으로 채워야 합니다.

find . -name '*~' -exec sh -c 'cp "$0" "${0%~}"' {} \;

이렇게 하면 스크립트를 작성할 필요가 없습니다. 한 문장만으로도 가능합니다.


--참고: 여기서는 "옵션 끝" 지정자가 필요하지 않습니다. 발견된 파일에 접두어가 붙어서 옵션으로 구문 분석되는 것을 방지하기 때문 cp입니다 .find./cp

(이 접두사의 예외는 ./현재 디렉토리 .자체가 "발견"된 경우이지만 물론 이름이 물결표로 끝나지 않으며 옵션 플래그로 오인될 수 없습니다.)


생성된 셸을 사용하여 복사본 이름에 물결표를 추가할 수도 있습니다. 즉, 다음을 사용합니다.

find . -name string -exec sh -c 'cp "$1" "$1"~' find-sh {} \;

다음보다 우선합니다:

find . -name string -exec cp {} {}~ \;  # Don't use this!

후자는 POSIX에서 지정하지 않기 때문에 이식성이 없습니다.

~에서POSIX 사양find:

만약유틸리티 이름또는토론문자열에 "{}" 두 문자가 포함되어 있는지 여부는 구현에 따라 정의되지만 "{}" 두 문자만 포함되는 것은 아닙니다.찾다이 두 문자를 바꾸거나 변경되지 않은 문자열을 사용하십시오.

...두 문자 "{}"를 포함하는 인수가 여러 개 있는 경우 동작이 지정되지 않습니다.

관련 정보