Bash - 공백을 밑줄로 바꾸고 여러 공백을 하나로 바꿉니다.

Bash - 공백을 밑줄로 바꾸고 여러 공백을 하나로 바꿉니다.

나는 rename파일 이름의 공백에 밑줄을 긋는 데 익숙합니다. 다음을 사용하십시오.

rename "s/ /_/g" * 

그런데 문제가 발생했습니다. 인터넷에서 다운로드한 파일에는 공백이 여러 개 있는 경우가 많습니다. 나는 불쾌한 해결 방법을 사용했지만(대부분의 경우 3개의 공백에서만 작동합니다.) 다음보다 더 우아한 방법이 있어야 합니다.

rename "s/   /_/g" *; rename "s/  /_/g" *; rename "s/ /_/g" *

답변1

다음은 나에게 효과적이었습니다.

rename 's/\s+/_/g' *

공백의 1개 인스턴스부터 무한개 인스턴스까지 일치합니다.

이것은 줄 바꿈 및 탭에서도 작동하지만 사용 사례에 따라 이것이 더 좋고 불필요하지 않을 것이라고 생각합니까? 하지만 공백을 구체적으로 일치시키려면 다음과 같이 할 수 있습니다.

rename 's/ +/_/g' *

답변2

IDK는 rename재귀적으로 작동합니다. 공백이 없는 하위 디렉터리와 공백이 있는 하위 디렉터리에 이름에 공백이 있는 빈 파일을 만들었습니다. 아래 코드는 밑줄을 사용하여 이름에 하나 이상의 공백이 있는 파일의 이름을 바꾸는 데 효과적이며 이름에 공백이 있는 하위 디렉터리를 방해하지 않습니다.

root@server <1>: /cwd# mkdir subdir1 'sub dir 2' ; touch 'subdir1/file 1' 'sub dir 2/file  2  ' 'subdir1/ f i l e 3 ' 'sub dir 2/   f  i  l  e   4   '

root@server <2>: /cwd# ls -lhR
.:
total 0
drwxr-xr-x 2 root root 80 Dec 28 00:42  subdir1
drwxr-xr-x 2 root root 80 Dec 28 00:42 'sub dir 2'

./subdir1:
total 0
-rw-r--r-- 1 root root 0 Dec 28 00:42 'file 1'
-rw-r--r-- 1 root root 0 Dec 28 00:42 ' f i l e 3 '

'./sub dir 2':
total 0
-rw-r--r-- 1 root root 0 Dec 28 00:42 'file  2  '
-rw-r--r-- 1 root root 0 Dec 28 00:42 '   f  i  l  e   4   '

root@server <3>: /cwd# find . -type f -exec echo {} \; | tee ../FILES.txt
./sub dir 2/   f  i  l  e   4
./sub dir 2/file  2
./subdir1/ f i l e 3
./subdir1/file 1

root@server <4>: /cwd# while IFS= read line ; do
> dirname="${line%/*}"
> fn=${line##*/}
> fn="${fn//+( )/_}"
> mv -v "$line" "${dirname}/${fn}"
> done < ../FILES.txt
renamed './sub dir 2/   f  i  l  e   4   ' -> './sub dir 2/_f_i_l_e_4_'
renamed './sub dir 2/file  2  ' -> './sub dir 2/file_2_'
renamed './subdir1/ f i l e 3 ' -> './subdir1/_f_i_l_e_3_'
renamed './subdir1/file 1' -> './subdir1/file_1'

root@server <5>: /cwd# ls -lhR
.:
total 0
drwxr-xr-x 2 root root 80 Dec 28 00:42  subdir1
drwxr-xr-x 2 root root 80 Dec 28 00:42 'sub dir 2'

./subdir1:
total 0
-rw-r--r-- 1 root root 0 Dec 28 00:42 file_1
-rw-r--r-- 1 root root 0 Dec 28 00:42 _f_i_l_e_3_

'./sub dir 2':
total 0
-rw-r--r-- 1 root root 0 Dec 28 00:42 file_2_
-rw-r--r-- 1 root root 0 Dec 28 00:42 _f_i_l_e_4_

각 명령에 대한 몇 가지 참고 사항:

  1. 이름에 공백이 포함된 두 번째 하위 디렉터리로 두 개의 하위 디렉터리를 만듭니다.

  2. 콘텐츠를 재귀적으로 나열합니다. 공백이 포함된 파일이나 폴더에는 작은따옴표가 사용됩니다.

  3. find파일( -type f)을 찾고 이름을 상위 디렉터리의 "FILES.txt"에 반영하는 데 사용됩니다 .

  4. 루프를 사용하여 while파일의 각 줄을 반복합니다. IFS=선행 및 후행 공백이 잘리지 않도록 입력 필드 구분 기호를 지웁니다.

    4.1 디렉터리 이름을 추출하고 수정하지 마세요.

    4.2 파일 이름 가져오기

    4.3 파일 이름에서 하나 이상의 연속 공백 문자를 단일 밑줄로 바꾸기

    4.4 파일 이름을 자세하게 바꾸되 폴더 이름은 바꾸지 마세요.

  5. 콘텐츠를 재귀적으로 나열합니다. 공백이 포함된 파일이나 폴더에는 작은따옴표가 사용됩니다.

매개변수 확장을 사용하여 디렉터리 이름과 파일 이름을 가져오는 것이 더 빠르기 때문에 대신 사용하고 dirname있습니다 basename.

관련 정보