명령줄을 사용하여 파일 이름을 디코딩하는 방법은 무엇입니까?

명령줄을 사용하여 파일 이름을 디코딩하는 방법은 무엇입니까?

명령줄을 통해 파일 이름을 디코딩할 수 있습니까?

다음 두 파일이 있다고 가정해 보겠습니다.

  • foo.mp3
  • 바.mp3

파일 이름을 UTF-8 값으로 디코딩할 수 있는 명령줄 도구가 있습니까?

  • 0x66 0x6F 0x6F 0x2E 0x6D 0x70 0x33
  • 0x62 0x61 0x72 0x2E 0x6D 0x70 0x33

답변1

16진수 바이트 값을 가져오는 표준(POSIX/Unix) 명령은 입니다 od.

file=foo.mp3
printf %s "$file" | od -An -vtx1

출력은 다음과 유사합니다.

 66 6f 6f 2e 6d 70 33

$file위 내용에는 모든 배열이 포함되어 있습니다(나누기용 zsh).바이트. 문자 인코딩은 고려되지 않습니다.

$file배열을 포함하고 싶다면수치(로케일 인코딩에서) 각 문자의 유니코드 코드 포인트를 16진수로 얻으려면 Little-Endian 시스템에서 다음을 수행할 수 있습니다.

printf %s "$file" | iconv -t UTF-32LE | od -An -vtx4

또한보십시오:

printf %s "$file" | recode ..dump

또는:

printf %s "$file" | uconv -x hex/unicode
printf %s "$file" | uconv -x '([:Any:])>&hex/unicode($1)\n'

다음 문자에 대해 바이트 값을 UTF-8로 인코딩된 16진수로 원하는 경우:

printf %s "$file" | iconv -t UTF-8 | od -An -vtx1

이는 ASCII 문자만 포함하는 유사한 콘텐츠와 foo.mp3동일합니다 .

답변2

그리고 perl:

$ perl -CA -le 'print join " ", map { sprintf "0x%X", $_ } unpack "U*" for @ARGV' \
  foo.mp3 bar.mp3 cường
0x66 0x6F 0x6F 0x2E 0x6D 0x70 0x33
0x62 0x61 0x72 0x2E 0x6D 0x70 0x33
0x63 0x1B0 0x1EDD 0x6E 0x67

이러한 파일 이름 목록을 파일에 저장하면 다음이 수행됩니다.

perl -CI -lne 'print join " ", map { sprintf "0x%X", $_ } unpack "U*"' <file

답변3

나는 이것이 간단한 Perl 스크립트로 이루어질 수 있다고 생각합니다:

perl -we 'foreach my $file (glob("*")) { 
   printf "0x%02X ", ord($_) foreach split//, $file; print "\n" }; '

디렉터리에 파일이 포함되어 있고 foo.mp3결과가 출력과 유사한 경우 bar.mp3:

0x62 0x61 0x72 0x2E 0x6D 0x70 0x33 
0x66 0x6F 0x6F 0x2E 0x6D 0x70 0x33 

glob()( 이름을 정렬 하고 싶습니다 .)

설명하다:

foreach my $file (glob("*")) {   # loop over all filenames in current directory 
    printf "0x%02X ", ord($_)    # take the character as a number, and print in hex
      foreach split//, $file;    # .. after splitting the filename to characters
    print "\n";                  # add a newline
}

(*점으로 시작하는 것은 제외)

이는 파일 시스템에 저장된 파일 이름의 실제 바이트만 인쇄합니다. 파일 이름이 UTF-8이 아닌 경우 스크립트는 이를 변환하지 않습니다.

또는 파일 이름 목록 외에 다른 데이터도 처리하는 ls파이프 와 같은 작업을 수행할 수도 있지만odxxd모든 질문읽기 기능이 포함되어 ls있어 파일 이름을 다른 줄로 분리하기가 어렵습니다.

답변4

일반 Bash 사용:

a=abcdefghij    
for ((i=0;i<${#a};i++));do printf %02X \'${a:$i:1};done
6162636465666768696A

printf필요에 맞게 형식을 사용자 정의하세요 .

관련 정보