다른 플랫폼(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
( rename
Debian 및 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
/