파일 이름을 유효하지 않게 만들기 위해 ":" 또는 "?"와 같은 문자를 처리하는 방법은 무엇입니까?

파일 이름을 유효하지 않게 만들기 위해 ":" 또는 "?"와 같은 문자를 처리하는 방법은 무엇입니까?

방금 음악 파일이 포함된 디렉토리를 이동하려고 시도했는데 thunar 4.10 파일 이름이 유효하지 않다고 불평했습니다.

알고 보니 파일명(노래제목)에 물음표가 있는 것으로 나타났습니다. 나는 이것이 문제라고 의심했고 물음표를 제거하면 파일을 복사할 수 있었습니다. "?"를 다시 추가할 수 없습니다. 명령줄에서도 시도했지만 rename역시 작동하지 않았습니다. (thunar가 내부적으로 무엇을 사용하는지 확실하지 않으므로 이 테스트는 논쟁의 여지가 있을 수 있습니다)

이제 물음표로 인해 파일 이름이 무효화되면 파일은 처음에 어떻게 생성됩니까? SoundJuicer새로 구입한 CD로 이러한 파일을 만들었습니다 . 다양한 플레이어에서 파일(이름에 "?" 포함)을 재생할 수 있습니다.

여기서 무슨 일이 일어나고 있는 걸까요? 이름에만 "?"를 사용할 수 있나요? 다른 응용 프로그램에서는 처리할 수 있는 것처럼 보이는데 왜 파일 관리자에서는 이러한 파일을 처리할 수 없습니까?

고쳐 쓰다: 다음 노래에는 ":"이 포함되어 있습니다. "?"와 같은 문제

이는 Unix에 유효하지 않은 문자가 아닙니다. 일반적으로 NUL 문자와 / 문자만 유효하지 않은 파일 이름입니다(/는 디렉토리 구분 기호입니다).

나는 Linux에서 파일 이름 문제를 겪은 적이 없고 합리적인 모든 것을 던질 수 있고 잘 작동하기 때문에 내 직감도 나에게 말하는 것입니다. 이것이 바로 여기서 질문이 제기되는 이유입니다. 이전에는 잘못된 파일 이름을 본 적이 없습니다.

파일을 USB 드라이브로 이동해 보셨나요? 그렇다면 스틱이 FAT32로 포맷되어 있습니까, 아니면 기본 Linux 파일 시스템으로 포맷되어 있습니까?

대상은 과연 오늘 구입한 USB 플래시 드라이브입니다. 열어서 gpartedFAT32로 포맷했습니다.

잘 모르겠지만 그건 Windows의 문제죠, 그렇죠? Windows에는 분명히 ?및 를 포함하여 지원되지 않는 문자가 많이 있습니다 :. 내가 맞나요?

답변1

이러한 문자는 FAT32 파일 시스템에서는 ?유효하지 않으므로 :해당 시스템에 파일을 복사해야 하는 경우~ 할 것이다이름을 바꿔야 합니다.

명령줄에서 이러한 문자를 바꾸 거나 명령줄 도구 rename(때때로 다음이라고도 함 )를 사용하여 제거할 수도 있습니다.prename_

rename 's/[?<>\\:*|\"]/_/g'    # Change invalid characters to _
rename 's/[?<>\\:*|\"]//g'     # Remove invalid characters

저는 이에 익숙하지 않아서 thunar이 교체/교체 작업을 직접 수행할 수 있는 방법이 있는지 모르겠습니다.

방금 알아냈어Linux에서 fat32 파일 시스템으로 복사: 잘못된 매개변수pax이는 로컬 디스크에 전체 파일 이름을 유지하면서 파일 이름을 변환할 수 있도록 명령(파일 복사를 위한 또 다른 도구) 에 이를 추가하는 것을 제안합니다.복사하는 동안USB 장치에:

pax -rw -s '/[?<>\\:*|\"]/_/gp' *.mp3 /media/usb_device

전체 파일 이름이 정말 중요하다면 USB 스틱을 다시 포맷하여 Linux 기본 파일 시스템을 사용하는 것이 좋습니다 ext4.사용 가능한 Windows 드라이버파일 extN시스템 제품군용(필요한 경우). )

답변2

?파일명에 포함하는 것은 절대적으로 허용됩니다 .

POSIX 표준에서:

파일 이름

{NAME_MAX}파일 이름을 지정하는 데 사용되는 1부터 바이트까지의 바이트 시퀀스입니다 . 이름을 구성하는 바이트에는 <NUL>또는 <slash>문자가 포함될 수 없습니다. 경로 이름의 맥락에서 각 파일 이름 뒤에는 하나 <slash>이상의 <NUL>문자가 와야 합니다. 다른 곳에서는 파일 이름 뒤에 문자가 오면 <NUL>문자열을 형성합니다(반드시 문자열일 필요는 없음). 파일 이름 dot 및 dot-dot에는 특별한 의미가 있습니다. 파일 이름은 "경로 이름 구성 요소"라고도 합니다. 경로 이름도 참조하세요.

따라서 파일 이름에 사용할 수 있는 유일한 문자는 다음과 같습니다.아니요포함은 \0(문자열의 끝을 나타냄) 및 /(경로 구분 기호)입니다. 또한 파일 이름 ...특별하므로 생성한 파일에서 이를 사용하지 않을 수도 있습니다.

일부 캐릭터는 특별합니다.껍질을 벗기다그리고 와일드카드 패턴으로 처리되지 않도록 쉘에서 올바르게 이스케이프하거나 인용해야 합니다. 물음표는 일반적으로 쉘의 와일드카드 패턴에서 "모든 문자"를 나타내기 때문에 이러한 문자 중 하나입니다.

:내 생각엔 Thunar가 이러한 파일 이름을 문자 및 ?(및 <, >, ", |, \*사용) 로 처리하지 않기로 결정한 것 같습니다.윈도우즈에서, Windows와 Unix 간에 이식 가능한 파일 이름을 사용하도록 강제하려고 합니다. 그 이유는 모르겠지만 Thunar가 Windows 시스템과 공유되는 파일 시스템에서 작동하도록 하는 것과 관련이 있을 수 있습니다.

편집하다: 더 많은 정보로 질문을 업데이트한 후에는 파일 시스템이 실제로 Windows 파일 시스템이기 때문에 파일이 Windows 명명 규칙을 준수해야 한다는 것이 분명해졌습니다.

@roaima의 답변renameLinux 유틸리티를 사용하여 파일 이름을 바꾸는 방법을 보여줍니다 . 잘못된 Windows 문자가 포함된 파일의 이름을 밑줄( ) 로 변경 rename하는 기능이 없는 시스템에 대한 또 다른 솔루션은 다음과 같습니다 bash.fatmv_

function fatmv {
    name="$( basename "$1" )"
    destdir="$2"

    fat_name="$( tr ':?<>"|\\*' '_' <<<"$name" )"

    if [[ -n "$destdir" ]]; then
      fat_name="$destdir"/"$fat_name"
    fi

    echo mv -f -- "$1" "$fat_name"
}

두 번째 인수를 사용하는 경우 이름이 변경된 파일을 이동해야 하는 대상 디렉터리로 간주됩니다.

$ fatmv '<illegal>:filename?' /mount/fat_disk/
mv -f -- <illegal>:filename? /mount/fat_disk//_illegal__filename_

있는 그대로 테스트한 다음 제거하여 echo실제로 작업을 수행하세요.

답변3

이것은 ?bash에서 중요한 의미를 갖는 특수 문자이므로 이스케이프하여 사용할 수 있습니다.\

즉:

touch test\?

파일을 만들 것입니다 :

test?

당신은 그것을 이동할 수 있습니다

mv test\? /new/loction/test\?

편집: 특수 문자와 동일합니다..

공백이 포함된 파일 이름에도 필요합니다.

this is a file

이동해야 합니다:

mv this\ is\ a\ file <location>

답변4

?@serv-inc 및 @roaimas를 적용하여 디렉터리의 모든 파일 이름에서 다른 모든 문자(예: FAT32가 아닌 유효한 유니코드 문자) 뿐만 아니라 바꾸려면 다음 :명령을 사용할 수 있습니다.[A-Za-z0-9]_

for file in *.mp3 ; do var=$( echo $file | sed -e 's/[^A-Za-z0-9]/_/g'); var=${var:0:60} ; var=${var%_mp3}.mp3 ; mv "$file" $var ; done

또한 FAT32의 MP3 파일 이름이 너무 길어서 기본 이름을 60자로 줄였습니다(최대 길이는 모르겠지만 60자가 적합했습니다). 조심하세요이것씌우다파일을 이동하여 원래 파일 이름을 복원합니다.

관련 정보