파일 이름의 접두사와 중간 부분으로 파일 이름을 바꿉니다.

파일 이름의 접두사와 중간 부분으로 파일 이름을 바꿉니다.

어느 시점에서 다음을 수행하는 스크립트가 있습니다.

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 스크립트 호출이 있는 동안 파일 이름을 삭제 하고 싶습니다 .REPLACEMEREPLACEMEfile.js-test.test

답변1

예를 들어 (이전의 확장자를 모르는 경우 ) stuff-X.js.test로 이름을 바꾸려면 여러 표현식을 사용하여 원하는 부분을 추출해야 합니다. 예를 들어 경로를 머리 와 꼬리 로 나눈 다음 대시 앞 과 중간에 대한 문자열을 가져옵니다. 예를 들어 , 이 발췌문에서 새 확장자는 이제 다음과 같습니다 .stuff.js.testh=${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 {} \;  

관련 정보