첫 번째 특수 문자(예: ♫)가 포함된 파일 이름 처리

첫 번째 특수 문자(예: ♫)가 포함된 파일 이름 처리

최근에 파일 이름이 "♫" 문자로 시작하는 파일을 발견했습니다. 이 파일을 복사해서 에 입력 ffmpeg하고 터미널에서 다양한 방법으로 참조하고 싶습니다 . 나는 보통 이상한 파일 이름을 자동 완성하지만 첫 글자조차 입력할 수 없기 때문에 실패합니다.

복사-붙여넣기 작업을 수행하기 위해 마우스로 전환하고 싶지 않습니다. 가능한 시나리오에 대해 많은 코드를 외우고 싶지 않습니다. 내 임시 해결책은 로 전환하여 문제의 문자를 vim붙여넣고 !ls복사한 다음 종료하고 터미널에 붙여넣는 것이었습니다. 이것은 효과가 있지만 매우 무섭습니다.

이 상황을 처리하는 더 쉬운 방법이 있습니까?

노트:상황이 바뀌면 생선 껍질을 사용하고 있습니다.

답변1

파일 이름의 첫 번째 문자가 인쇄 가능하지만 영숫자나 공백이 아닌 경우 [[:punct:]]glob 연산자를 사용할 수 있습니다.

$ ls *.txt
f1.txt  f2.txt  ♫abc.txt
$ ls [[:punct:]]*.txt
♫abc.txt

답변2

마음에 드는 가장 간단한 접근 방식은 ls [^a-zA-Z0-9]*그것이 나에게 효과적이라는 것입니다. 그러나 terdon의 대답은 extglob 쉘 옵션이나 심지어 쉘 독립적 접근 방식에 주의를 끄는 데 더 나은 작업을 수행합니다.

답변3

ls에는 인쇄할 수 없는 문자를 처리하기 위한 몇 가지 스위치(예: --quote-name, --escape, --literal)가 있지만 이 경우 문자는 "인쇄 가능"하지만 "입력 가능"하지는 않은 것 같습니다(적어도 내 키보드에서는 ! ), 따라서 이러한 스위치 중 어느 것도 도움이 되지 않는 것 같습니다.

따라서 이름에 문자가 포함된 파일을 삭제하는 일반적인 "무차별 대입" 방법으로 다음을 수행할 수 있습니다.

$ /bin/ls -1A|cat -n  # list all files (except . and ..), 1 per line, add line numbers
     1  ♫
     2  f1.txt
     3  f2.txt

문제가 있는 파일이 포함된 줄을 찾으세요. 아마도 첫 번째 행일 가능성이 높지만 다섯 번째 행이라고 가정해 보겠습니다. 5번째 줄을 인쇄하고 16진수로 인코딩합니다.

$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a                                      ....

0a(개행) 문자를 무시하고 이스케이프 문자열을 구성한 다음 echo의 -e 옵션을 사용하여 이스케이프를 변환합니다.

$ echo -e '\xe2\x99\xab'

이제 다음과 같이 복사/이동/삭제할 수 있습니다.

$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’

또는 쉘 스크립트 사용에만 국한되지 않는 경우 Python에서 다음과 같이 수행할 수 있습니다.

$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')

이 접근 방식을 사용하면 많은 파일을 처리할 수 있으며 올바른 파일을 선택하고 파일을 손상시키지 않고 이름을 바꾸는 등의 논리를 작성하기만 하면 됩니다.

for f in os.listdir('.'):
  if not f.isalnum():
    newname = generate_newname(f)
    if not os.path.exists(newname):
      shutil.copy(f, newname)
    else:
      print newname, 'already exists!'

답변4

심볼릭 링크 이름 바꾸기

특수 문자(파일 이름의 첫 번째 문자 또는 다른 위치)가 포함된 파일 이름을 처리하는 한 가지 방법은 다음과 같습니다.좀 더 간단한 이름으로 바꾸세요..

필요하신 경우에도 사용하실 수 있습니다원본 파일 이름 유지: 파일 이름의 복사본을 이름을 바꿉니다.
파일을 복사하거나 생성하여 수행할 수 있습니다.심볼릭 링크 또는 하드 링크파일에 저장하고 이름을 바꿉니다. 복사본 대신 심볼릭 링크를 생성하려면 cp옵션 -s( 하드 링크의 경우)을 사용하십시오.-l

"디톡스"를 사용하여 이름을 정화하세요

깨끗한 파일 이름으로 이름을 바꾸려면detox파일 이름을 정리하기 위해 정의된 다양한 규칙에 따라 파일 이름을 바꾸는 데 사용할 수 있습니다.detoxrc문서. 기본적으로 UTF8 문자는 옵션으로 제거되며 다음 -s utf_8-only으로 대체됩니다 _.

$ touch '♫ 漢字カ' ♫foo
$ ls -1
♫foo
♫ 漢字カ
$ detox -s utf_8-only * 
$ ls -1                
_ ___
_foo


심볼릭 링크의 "Detox"

위의 심볼릭 링크 처리와 결합:

$ mkdir orig
$ cd orig 
$ touch '♫ 漢字カ' ♫foo
$ cd ..
$ mkdir clean
$ cd clean 
$ cp -s ../orig/* .
$ ll               
lrwxrwxrwx 1 14 Oct  8 05:52 ♫foo -> ../orig/♫foo
lrwxrwxrwx 1 21 Oct  8 05:52 ♫\ 漢字カ -> ../orig/♫\ 漢字カ
$ ls -1
♫foo
♫ 漢字カ
$ detox --special -s utf_8-only *
$ ll                                
lrwxrwxrwx 1 21 Oct  8 05:52 _\ ___ -> ../orig/♫\ 漢字カ
lrwxrwxrwx 1 14 Oct  8 05:52 _foo -> ../orig/♫foo

관련 정보