이것으로 고군분투하고 인터넷 검색이 작동하는 솔루션을 제공하지 않는 것 같습니다.
이름이 ...
file å?? name.txt
예를 들어 문제를 피하기 위해 이름을 바꾸고 싶지만 방법을 해결하기 위해 고군분투하고 있습니다. 나는 사용 ' '
을 시도했고 \
각 특수 문자 전에 사용을 시도했지만 'file \å\?\? name \(2008\).txt'
다음과 같은 오류가 발생합니다 ...
-bash: cd: file \å\?\? name \(2008\).txt : No such file or directory
이것이 부적절하게 사용 \
되거나 대체 접근 방식이 필요합니까?
감사
비 ASCII 문자는 문제가 아니며 쉘은 å
완벽하게 처리 할 수 있습니다. 문제는 파일 이름이 실제로 å??
. 경우는 있었다, rm 'å??'
또는 rm å??
일 것입니다.
당신은 그것의 가정 å??
때문에 어떤이의 ls
그 합리적인 가정이지만, 프로그램 및 ls
다양한 것들을 보여줄 것이다 ?
. 예를 들면 :
$ mkdir "file å"\?\?" name.txt" "file å"$'\n'$'\n'" name.txt" "file å"$'\t'$'\t'" name.txt" "file å"$'\r'$'\r'" name.txt" "file å"$'\b'$'\b'" name.txt" "file å"$'\v'$'\v'" name.txt"
$ ls -l
total 24K
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:01 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
위에서 볼 수 있듯이 줄 바꿈, 탭, 캐리지 리턴, 벨 및 세로 탭 (그 중에서도)은 모두로 표시됩니다 ?
. 위에서 만든 파일 / 디렉토리의 첫 번째 파일 / 디렉토리 만 실제로 ?
이름에 있습니다. 다음을 통해 확인할 수 있습니다 ls -b
.
$ ls -lb
total 24
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å??\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å\b\b\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å\t\t\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:01 file\ å\n\n\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å\v\v\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å\r\r\ name.txt
따라서 실행 ls -b
하여 올바른 파일 이름을 얻은 다음 ANSI C 인용 을 사용 하여 이름을 바꿀 수 있습니다.
mv å$'\r'$'\r' newname
또는 glob을 사용하여 이름이 다음으로 시작하는 모든 파일 / 디렉토리를 일치시킬 수 있습니다 file å
( 참고 : 하나만있는 경우에만 작동합니다).
mv "file å*" newname
또는 이름에 영숫자가 아닌 문자가 포함 된 모든 파일 / 디렉토리의 이름을 바꿉니다 (다시 말하지만 이러한 대소 문자가 하나 인 경우에만 유용함).
shopt -s extglob ## turn on extended globbing
mv !(*([[:graph:]])) newname
이상한 !(*([[:graph:]]))
것은 설명이 필요합니다. "not foo"와 일치 extglob
하는 !(foo)
데 사용할 수있는 확장 된 globbing을 활성화 합니다. [[:graph:]]
문자 클래스는 따라서 부정 일치하는 인쇄 가능한 모든 문자 (개행 문자 등을하지 탭)과 일치하는 !(*([[:graph:]]))
비 인쇄 문자 모든 파일 / dirnames 일치하는 것이다.
이러한 경우를 두 개 이상 처리해야하는 경우 루프를 사용하십시오. 다음과 같은 것 :
for dir in !(*([[:graph:]])); do
mv "$dir" "${dir//[^[:graph:]]/_}";
done
는 ${dir//[^[:graph:]]/_}
대체 모든 비 인쇄 문자와 디렉토리 이름입니다 _
. 이 접근 방식의 문제점은 동일한 이름으로 끝나는 다른 소스 디렉토리를 가질 수 있다는 것입니다 (예 : foo\n
및 foo\t
둘 다 foo_
). 이것이 문제인 경우 카운터를 사용하여 이름을 변경하십시오.
a=0; for dir in !(*([[:graph:]])); do
((a++));
mv "$dir" "${dir//[^[:graph:]]/_}$a"
done
결과는 다음과 같습니다.
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt1
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt2
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt3
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å??_name.txt4
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt5
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt6
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다