그것을 사용할 때
$ 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
:
만약유틸리티 이름또는토론문자열에 "{}" 두 문자가 포함되어 있는지 여부는 구현에 따라 정의되지만 "{}" 두 문자만 포함되는 것은 아닙니다.찾다이 두 문자를 바꾸거나 변경되지 않은 문자열을 사용하십시오.
...두 문자 "{}"를 포함하는 인수가 여러 개 있는 경우 동작이 지정되지 않습니다.