부분 경로 이름을 사용하여 파일 이름 바꾸기

부분 경로 이름을 사용하여 파일 이름 바꾸기

디렉터리 이름의 일부를 사용하여 모든 로그의 이름을 바꿔야 합니다.

로그는 다음과 같습니다.

friday13/stack123/FooBar-QA-123/000001.gz
friday13/stack123/FooBar-QA-123/000002.gz
friday13/stack123/FooBar-QA-123/000003.gz

friday13/stack123/FooBar-Stage-456/000001.gz
friday13/stack123/FooBar-Stage-456/000002.gz
friday13/stack123/FooBar-Stage-456/000003.gz

friday13/stack123/FooBar-Prod-789/000001.gz
friday13/stack123/FooBar-Prod-789/000002.gz
friday13/stack123/FooBar-Prod-789/000003.gz

위 디렉터리의 각 파일에 대해 이름을 다음과 같이 바꿔야 합니다.

FooBar-QA-123-000001.gz
FooBar-QA-123-000002.gz
FooBar-QA-123-000003.gz

FooBar-Stage-456-000001.gz
FooBar-Stage-456-000002.gz
FooBar-Stage-456-000003.gz

FooBar-Prod-789-000001.gz
FooBar-Prod-789-000002.gz
FooBar-Prod-789-000003.gz

미리 도움을 주셔서 감사합니다!

답변1

매개변수 확장 사용하위 문자열 삭제mv반환된 각 파일 이름에 대한 명령의 대상 인수를 생성 하려면 다음을 수행합니다 find.

find . -type f -name '*.gz' -exec sh -c 'mv -- "$1" "${1%/*}-${1##*/}"' sh {} \;

또는 유사하게 다음을 사용 dirname하십시오 basename.

find . -type f -name '*.gz' -exec sh -c '
    mv -- "$1" "$(dirname "$1")-$(basename "$1")"
' sh {} \;

참고: 항상 유사한 명령을 먼저 대체 mv하여 테스트하십시오.echo

답변2

분명히 thanasisp의 답변은 귀하의 게시물과 귀하가 제공한 샘플 출력을 기반으로 하지만 /로 변경되지는 않습니다 -. 귀하의 게시물 아래에 첨부된 댓글에서 예상되는 전체 처리를 얻으려면 다음을 수행할 수 있습니다. 파일을 보존하세요. 기본 이름은 6번째 문자로 시작합니다...

관심 있는 파일 탐지가 다음과 같은 경우에 도움이 되는 경우:

$ find friday13 -type f -name "*.gz"

(위의 기본 cmd가 제대로 작동하는지 확인해야 합니다 find.) 전체 cmd는 다음과 같습니다.

$ find friday13 -type f -name '*.gz' -exec bash -c '
      var=$(sed "s/\//-/g;s/^\.-//" < <(echo $1));
      echo mv -- "$1" "${var%-*}-$(cut -c6- < <(echo ${var##*-}))"
      ' execbash {} \;

echo인쇄된 명령이 원하는 대로 수행된다는 확신이 들면 위의 코드 조각에서 명령을 제거하기만 하면 됩니다 mv.

관련 정보