ls 출력 또는 파일 작업에서 파일 이름에 작은따옴표가 필요한 mv(이름 바꾸기) 스크립트에 대한 도움이 필요합니다.

ls 출력 또는 파일 작업에서 파일 이름에 작은따옴표가 필요한 mv(이름 바꾸기) 스크립트에 대한 도움이 필요합니다.

ls 출력에서 ​​작은따옴표로 표시된 파일 이름이나 파일 작업에 작은따옴표가 필요한 파일을 mv(이름 바꾸기)할 수 있는 스크립트에 대한 도움이 필요합니다. 이 스크립트는 디렉터리의 모든 파일 이름을 바꾸는 데 사용됩니다. 스크립트를 테스트하기 위해 미국 키보드에서 입력할 수 있는 영숫자가 아닌 표시 가능한 모든 문자("a/b" 및 "a'b" 제외)를 사용하여 일련의 테스트 파일을 만들었습니다.

touch 'a~b' 'a`b' 'a!b' 'a@b' 'a#b' 'a$b' 'a%b' 'a^b' 'a&b' 'a*b' 'a(b' 'a)b' 'a-b' 'a_b' 'a+b' 'a=b' 'a{b' 'a}b' 'a[b' 'a]b' 'a|b' 'a\b' 'a:b' 'a;b' 'a"b' 'a<b' 'a>b' 'a,b' 'a.b' 'a?b' 'a b'

이제 내 테스트 디렉터리에는 다음이 포함됩니다.

psilo@deb:~/sh$ ls
'a$b'   a#b   'a)b'   a-b   'a<b'   a@b   'a^b'  'a|b'
'a b'   a%b   'a*b'   a.b   'a=b'  'a[b'   a_b    a}b
'a!b'  'a&b'   a+b    a:b   'a>b'  'a\b'  'a`b'   a~b
'a"b'  'a(b'   a,b   'a;b'  'a?b'   a]b    a{b    filenametweak.sh

또한 개인적으로 선호하는 것은 tr을 공백으로 변경하는 것입니다. 그리고 밑줄 a.

내 스크립트는 다음과 같습니다

#!/bin/bash
for file in *; do echo mv "$file" `echo $file | tr ' ' '.' | tr '_' '.' | tr -cd '\043\045\053-\056\060-\072\077\100-\132\135\141-\173\175\176'` ; done

작은따옴표 사이에 표시된 ASCII 8진수 값 이외의 tr 명령(-c 및 -d 매개변수 포함)을 통해 입력 스트림에서 모든 문자를 제거하려고 합니다. 그러면 "문제" ASCII 문자가 제거된 출력이 생성됩니다(위의 ls 출력에서 ​​파일 이름 주위에 작은따옴표가 필요한 문자).

트리거를 당기기 전에 출력을 테스트하기 위해 스크립트의 mv "$file" 앞에 echo 명령을 포함시켰습니다.

그러나 스크립트가 파일 이름에서 "?" 또는 "*" 문자를 발견하면 원치 않는 출력이 생성됩니다.

psilo@deb:~/sh$ ./filenametweak.sh
mv a$b ab
mv a b a.b
mv a!b ab
mv a"b ab
mv a#b a#b
mv a%b a%b
mv a&b ab
mv a(b ab
mv a)b ab
mv a*b ab.a.b.ab.ab.a#b.a%b.ab.ab.ab.ab.a+b.a,b.a-b.a.b.a:[email protected]]b.ab.a.b.ab.a{b.ab.a}b.a~b
mv a+b a+b
mv a,b a,b
mv a-b a-b
mv a.b a.b
mv a:b a:b
mv a;b ab
mv a<b ab
mv a=b ab
mv a>b ab
mv a?b ab.a.b.ab.ab.a#b.a%b.ab.ab.ab.ab.a+b.a,b.a-b.a.b.a:[email protected]]b.ab.a.b.ab.a{b.ab.a}b.a~b
mv a@b a@b
mv a[b ab
mv a\b ab
mv a]b a]b
mv a^b ab
mv a_b a.b
mv a`b ab
mv a{b a{b
mv a|b ab
mv a}b a}b
mv a~b a~b
mv filenametweak.sh filenametweak.sh

파일 이름에 * 또는이 있는 경우 문제를 해결하는 방법은 무엇입니까? bash에서 내 mv 이름 변경 의도를 달성하는 다른 및/또는 더 나은 방법이 있습니까?

답변1

나는 마침내 다른 프로젝트를 작업하는 동안 이 스크립트를 다시 방문하게 되었고, 물음표가 포함된 파일 이름 문제를 해결했습니다.

다음은 파일 작업에 작은따옴표나 큰따옴표가 필요하지 않은 방식으로 모든 파일의 이름이 지정되도록 현재 작업 디렉터리의 모든 파일 이름을 바꾸는 스크립트 솔루션입니다.

#!/bin/bash
for file in *; do echo mv "$file" `echo "$file" | tr ' ' '.' | tr '_' '.' | tr -cd '\043\045\053-\056\060-\072\100-\132\141-\173\175\176'` ; done

위에서 언급한 대로, 이는 tra에 공백(8진수 40) 문자를 추가 .하고 a에 밑줄( _)을 추가합니다 .. 이것은 Linux 파일 이름에 대한 개인적 선호입니다. 원하는대로 조정하십시오.

내 목적은 tr -cd파일 작업을 위해 파일 이름을 작은따옴표나 큰따옴표로 묶어야 하는 모든 입력 문자를 제거하는 것입니다. 여기서 예외는 ]작은따옴표나 큰따옴표가 필요하지 않은 닫는 대괄호/오른쪽 대괄호(8진수 135, )입니다. 일관성을 위해 오른쪽/오른쪽 대괄호를 제거하기로 결정했습니다. 흥미롭게도 왼쪽/왼쪽 대괄호(8진수 133, [)에는 파일 작업에 작은따옴표 또는 큰따옴표가 필요하기 때문입니다.

  • 다음 명령을 사용하여 스크립트를 테스트합니다.
    ~$ touch 'test~`!@#$%^&*()-_+={}[]|\:;"<>,.? test'
    ~$ ls
    filenametweak.sh 'test~`!@#$%^&*()-_+={}[]|\:;"<>,.? test'
    
  • 스크립트를 실행합니다.
  • 결과:
    ~$ ls
    filenametweak.sh  test~@#%-.+{}:,..test
    

관련 정보