어느 시점에서 다음을 수행하는 스크립트가 있습니다.
for src in $(find -H "$ROOT_DIR" -maxdepth 5 -name '*.test' -not -path '*.git*')
do
fixed_filename=$(echo "$(basename "${src%.*}")" | sed 's/-test//')
기본적으로 다음과 같은 파일이 있습니다.thing-test.js.test
반복할 때 파일 이름으로 끝내고 싶습니다.thing.js
궁극적으로 다음을 사용하여 파일의 전체 경로를 만듭니다.path="$ROOT_DIR"/"$fixed_filename"
~ 위에~인 것 같다작동하지만 확실히 정확하지 않습니다. 저는 열렬한 shellcheck 사용자이고 쓸모없는 에코가 있다고 알려주고(동의함) ${variable//search/replace}
최대한 많이 시도합니다.
이것이 위의 내용을 정리하는 데 도움이 되기를 바랍니다.
편집하다:
내가 하고 싶은 일의 기본 요지는 다음과 같다.
특정 파일 이름 패턴을 따라 디렉터리의 모든 파일을 재귀적으로 검색하려고 합니다. 예를 들어 이러한 파일 내부에는 자리 표시자 변수가 있습니다. 예를 들어 이러한 모든 파일을 찾아서 사용자가 제공한 문자열로 하나씩 바꾸고 file-test.js.test
싶습니다 . bash 스크립트 호출이 있는 동안 파일 이름을 삭제 하고 싶습니다 .REPLACEME
REPLACEME
file.js
-test
.test
답변1
예를 들어 (이전의 확장자를 모르는 경우 ) stuff-X.js.test
로 이름을 바꾸려면 여러 표현식을 사용하여 원하는 부분을 추출해야 합니다. 예를 들어 경로를 머리 와 꼬리 로 나눈 다음 대시 앞 과 중간에 대한 문자열을 가져옵니다. 예를 들어 , 이 발췌문에서 새 확장자는 이제 다음과 같습니다 .stuff.js
.test
h=${path%/*}
t=${path##*/}
${t%%-*}
noext=${t%.*}
ext=${noext##*.}
find . -name '*-*.test' -exec sh -c 'h=${1%/*}; t=${1##*/}; noext=${t%.*};\
ext=${noext##*.}; fixed=${h}/${t%%-*}.${ext}; echo mv "$1" "$fixed"' sh {} \;
답변2
find
쉘 플래그와 함께 명령을 사용하십시오 -exec
.
$ find -name "*.test" -exec sh -c 'echo "$(basename -s ".test" "$1")".js' sh {} \;
one.js
three.js
two.js
접미사가 제거 되므로 먼저 호출할 basename -s ".test" "$1"
필요가 없습니다 .sed
해당 "고정 파일 이름"으로 다른 작업을 수행해야 하는 경우 에코를 변수 할당으로 바꾸고 sh
동일한 명령으로 계속 작업하세요. 이 같은:
$ find -name "*.test" -exec sh -c 'fixed_name=$(basename -s ".test" "$1").js; my_other_command "$fixed_name"' sh {} \;