파일 이름 교차 플랫폼 호환성을 위한 쉘 스크립트

파일 이름 교차 플랫폼 호환성을 위한 쉘 스크립트

다른 플랫폼(Linux, MacOS, Windows 등)으로 전송할 때 문제를 일으킬 수 있는 특정 파일 이름을 특정 대체하기 위해 파일 관리자의 컨텍스트 메뉴를 통해 실행할 수 있는 셸 스크립트를 만들려고 합니다.

지금까지 나는 초급 수준의 스크립팅 기술을 사용하여 다음과 같은 (아마도 꽤 지저분한) 코드를 얻었지만 여전히 이러한 문자를 대체할 방법을 찾는 데 어려움을 겪고 있습니다. ''"/(이 스마트 싱글 및 다른 sed 표현식처럼 큰따옴표와 슬래시를 사용하면 파일이 삭제됩니다!

내가 가진 또 다른 문제는 터미널에 직접 입력할 때 작동하지만 스크립트가 파일 이름 앞의 공백을 제거할 수 없다는 것입니다.

해결책을 찾는 데 도움이 되었으면 좋겠습니다.

for filename in "${@}"; do
    NEWNAME="$(echo "$filename" | sed -e 's/:/-/g' -e "s/'//g" \
    -e 's/["|?|*]//g' -e 's/[<|>]/ /g' -e 's/\\/ /g' -e 's/\[/ /g' \
    -e 's/\]/ /g' -e 's/\s\s*/ /g' -e 's/^\s\s*//g' -e 's/\s\s*\./\./g')"
    mv "$filename" "$NEWNAME"
done

답변1

그냥 사용하세요 perl-rename( renameDebian 및 Ubuntu 등에서 발견됨). 먼저 테스트 목적으로 잘못된 이름을 만들어 보겠습니다.

touch "   a truly “horrible”, ‘awful’"$'\n'"name     with a newline and *globs*, and even a 'single' quote or two!   .txt"

다음과 같습니다.

$ ls
'   a truly “horrible”, ‘awful’'$'\n''name     with a newline and *globs*, and even a '\''single'\'' quote or two!   .txt'

줄 바꿈이 있다는 점에 유의하세요. 이를 반복해 보면(죄송합니다) 다음과 같은 내용이 표시됩니다.

$ for f in *; do echo "$f"; done
   a truly “horrible”, ‘awful’
name     with a newline and *globs*, and even a 'single' quote or two!   .txt

따라서 이 이름은 여러분이 직면하게 될 문제의 전부는 아니더라도 대부분을 포함합니다. 이제 rename나쁜 문자를 제거하려면 다음을 사용하십시오.

$ rename 's/[*“”‘’\n<|>"[\]]//g; s/:/-/g; s/\s+/ /g; s/^\s*//; s/\s+\././g; '"s/'//g" *
$ ls -N
a truly horrible, awfulname with a newline and globs, and even a single quote or two!.txt

보시다시피, 이것은 여러분이 찾고 있는 모든 나쁜 것들을 제거합니다. (내가 알 수 있는 한, 저는 계속하려는 여러분의 sed 시도만 있기 때문에) 다음과 같이 스크립트에 넣을 수 있습니다.

for filename in "${@}"; do
    rename 's/[*“”‘’\n<|>"[\]]//g; 
    s/:/-/g; 
    s/\s+/ /g; 
    s/^\s*//; 
    s/\s+\././g; '"s/'//g" "$filename"
done

설명하다

기본 구문은 매우 유사하며 sed동일한 대체 연산자를 사용합니다. 정규 표현식은 다음과 같습니다:

  • s/[*“”‘’\n<|>"[\]]//g;*: , , , , , \n, <, |, >, 또는 `] 항목을 모두 아무것도 없는 것으로 바꾼 "다음 [삭제합니다.
  • s/:/-/g: 공백 문자(기본적으로 공백, 탭 또는 줄바꿈)를 -.
  • s/\s+/ /g: 하나 이상의 연속된 공백 문자를 모두 단일 공백으로 바꿉니다. * s/^\s*//: 파일 이름 시작 부분의 모든 선행 공백을 제거하고,
  • s/\s+\././g: 하나 이상의 선행 공백 문자를 삭제합니다 ..
  • "s/'//g": 작은따옴표를 모두 제거합니다. 전체 명령이 어떻게 rename '...'추가되었는지 확인하세요 "s/'//g". 이는 작은 따옴표로 묶인 문자열 내에서 작은 따옴표를 이스케이프 처리할 수 없기 때문에 작은 따옴표로 묶인 문자열을 닫고 문자를 처리하기 위해 큰 따옴표로 묶인 새 문자열을 열어야 하기 때문입니다 '.

또한 with 는 파일 이름에 허용되지 않는 유일한 문자이고 include를 전혀 생성할 수 없기 /때문에 신경쓰지 않았습니다 ./\0/

관련 정보