최근에 파일 이름이 "♫" 문자로 시작하는 파일을 발견했습니다. 이 파일을 복사해서 에 입력 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