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
>>> 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!'
*restoffile.avi
아니면 이런거?