찾기 및 sed는 특수 문자를 바꿉니다.

찾기 및 sed는 특수 문자를 바꿉니다.

Synology NAS에서 많은 파일의 이름을 바꾸는 쉬운 방법을 찾고 있습니다. 찾았으며 sed사용 가능하지만 사용할 수 없습니다 rename.

다음을 사용하여 이러한 파일 및 폴더 목록을 얻을 수 있습니다.

find . \( -type d -name "@*" -prune \) -o \( -name "**" \) -print

위의 find 문은 Synology bash에서 ""로 대체된 "/" 문자를 포함하는 모든 파일을 표시합니다.

바꿔야 할 모든 특수 문자는 다음과 같습니다.  / \ : ? ' ’ ´ ’ 

사용되는 플랫폼 및 파일 공유 프로토콜에 따라 이러한 문자는 다르게 보이거나 다르게 표시되거나 전혀 표시되지 않거나 다양한 유형의 문제를 유발합니다. 다음을 통해 Synology bash에서 이러한 문자를 찾을 수 있습니다. -name "**" -o -name '*\\*' -o -name "*:*" -o -name "*\?*" -o -name "*\'*" -o -name "*´*" -o -name "*`*"

찾은 모든 파일과 디렉터리에서 이러한 문자를 어떻게 바꿀 수 있습니까? "/" 문자부터 시작하겠습니다.

도와주셔서 감사합니다!

게리

답변1

find명령이 이름을 바꾸려는 파일 세트와 정확히 일치하고 이름을 "안전한" 파일 이름으로 바꾸려고 한다고 가정합니다 . 파일 이름의 정확한 문자를 모르면 제안만 드릴 수 있지만 여기에는 두 가지가 있습니다.

  1. 이상한 문자를 제거하십시오. 이는 문자를 bash대체하여 기본적으로 처리 할 수 있다고 가정합니다.

     find . -depth \( -type d -name "@*" -prune \) -o \( -name "**" -execdir \
         bash -c 'echo "Processing $PWD"; for f; do echo mv -- "$f" "${f///}"; done' _ {} + \)
    
  2. 알려진 문자만 유지됩니다. tr보존하려는 문자 세트가 포함되어 있는지 확인하십시오 .

     find . -depth \( -type d -name "@*" -prune \) -o \( -name "**" -execdir \
         bash -c 'echo "Processing $PWD"; for f; do echo mv -- "$f" "$(tr -cd '[:alnum:][:punct:][:space:]' <<<"$f")"; done' _ {} + \)
    

두 경우 모두 echo디버깅을 활성 문으로 변환하려면 제거하세요.

답변2

for 루프를 사용하는 것에 대한 대안은 다음과 같습니다.

# Option globstar activates the ** (search recursivelly).
# Option nullglob removes an * when it matches no file/dir.
$ shopt -s globstar nullglob
$ for i in **/*; do
    # if the name of the file matches the pattern
    # perform the `mv` command
    [[ "$(basename "$i")" =~ ^@.*$ ]] && \
      mv -- "$i" "$(echo "$i" | sed -e 's;^@;;' -e 's;/@;/;')"
    [[ "$(basename "$i")" =~ ^**$ ]] && \
      mv -- "$i" "$(echo "$i" | sed 's;;;')"
  done

참고: 이동/삭제 명령을 실행하기 전에 백업을 만드는 것이 가장 좋습니다.

답변3

find 명령이 원하는 결과를 제공하는 경우 이를 sed로 파이프한 다음 sed에서 bash로 파이프할 수 있습니다(또는 bash/ash로 파이프하는 대신 파일로 리디렉션).

find . \( -type d -name "@*" -prune \) -o \( -name "**" \) -print | sed -n 's/\(.*\)\(\)\(.*\)/mv '"'&'"' '"'\1\3'"'/p' | bash
  • find 명령은 원하는 파일과 디렉토리를 나열합니다.
  • sed는 모든 줄을 반복하고 특수 문자를 대체/제거하며 각 줄을 bash/ash(mv) 실행으로 설정합니다.

또는 sed를 파일로 리디렉션하고 파일을 bash/ash할 수 있습니다(bash list_of_files_and_dirs_to_be_renamed). 실제 데이터에 사용하기 전에 중요하지 않은 파일/디렉토리에 대해 좋은 테스트를 수행하십시오.

관련 정보