Linux 쉘을 사용하여 공백이있는 파일의 이름을 바꾸려면 어떻게합니까?


28

공백이있는 여러 파일의 이름을 지정하고 공백을로 바꾸고 싶습니다 _. 그러나 파일 이름 (예 :)으로 쉘에 명령을 쓸 때마다 Spring 2011쉘은 파일이나 디렉토리를 인식하지 못합니다.

이것에 대해 어떻게해야합니까? 공백에 유니 코드 문자를 사용하는 방법이 있습니까?


프로그래밍 방식으로 N 파일의 이름을 바꾸려면 bashfor 루프를 사용 하십시오 . 여기에서 내 솔루션을 참조하십시오 .
Trevor Boyd Smith

답변:


33

예를 들어 공백을 피 Spring\ 2011하거나 따옴표를 사용하십시오 (예 :) 'Spring 2011'. 앞으로는 * NIX에서 파일 이름에 공백이있는 파일 이름을 사용하는 것이 일반적으로 좋지 않습니다.

당신이 가지고 있다면 rename, 당신은 이것을 사용할 수 있습니다 :

rename ' ' '_' [filenames...]

1
어쨌든 모든 파일에 대해 한 번 에이 작업을 수행 할 수 있습니까?

3
왜 나쁜 생각입니까? 파일 이름을 올바르게 처리하는 것은 프로그래머의 책임입니다.
glenn jackman 2016 년

1
@rafe, 실제로 파일 이름을 올바르게 처리하지 않으면 오류가 발생합니다. 파일 이름이 포함 된 변수를 인용하는 것을 잊었을 때 스크립트를 디버깅해야 할 때 추가 노력이 필요합니다.
glenn jackman 2016 년

3
이 답변은 효과가없는 것 같습니다 (적어도 우분투 12.04 LTS에서는). unutbu 의 대답은 작동합니다.
DNA

1
이것은 단지 (난이 도움이되지이다 ... 나를 위해 최초의 우주했다 rename버전 2.23)
트레버 보이드 스미스

30

머신에 rename 명령 이 있으면 현재 작업 디렉토리의 모든 파일 / 디렉토리에서 모든 공백이 밑줄로 바뀝니다.

rename 's/ /_/g' *

우분투 12.04에서 작업 확인
anthonygore

1
나를 위해 작동하지 않았습니다 ... "이름 바꾸기 : 인수가 충분하지 않습니다"라는 오류가 발생했습니다. 나는 버전이 rename --version rename from util-linux 2.23.2있습니다.
Trevor Boyd Smith

24

rename쉘만 사용하거나 선호 하지 않는 경우 :

for f in *\ *; do mv "$f" "${f// /_}"; done

세분화 :

  • *\ *for루프에 대한 입력으로 이름에 공백이있는 모든 파일을 선택합니다 .
  • "$f"파일 이름에 공백이 있다는 것을 알고 있기 때문에 따옴표 는 중요합니다 mv. 그렇지 않으면 2 이상의 인수로 나타납니다 .
  • ${f//str/new_str}bash 특정 문자열 대체 기능입니다. 의 모든 인스턴스가 str로 대체되었습니다 new_str.

2
이것은 작동하지만 나에게는 첫 번째 공간 만 바꿉니다. 내가 for f in *\ *; do mv "$f" "${f// /_}"; done그것을 사용 하면 작동
billynoah

@billynoah Good catch가 업데이트되었습니다.
blahdiblah

@blahdiblah 너무 감사합니다! 당신은 나를 너무 많은 시간을 절약했습니다!
게릴라

@ blahdiblah 귀하의 솔루션은 내 솔루션 보다 훨씬 우아 합니다 . 잘 했어. for 루프 glob가 작동한다고 생각하지 않았습니다 ... 그래서 for 루프 외부에서 glob을 수행했습니다.
Trevor Boyd Smith

3

mv "Spring 2011.file" Spring_2011.file 인용 된 문자열을 단일 입력으로 가져 오도록 명령 행에 지시해야합니다.


이것이 내가 일할 수있는 유일한 대답입니다.
blakeoft

1

프로그래밍 방식으로 N 파일의 이름을 바꾸려면 간단한 bashfor 루프를 사용할 수 있습니다 .

#!/bin/bash

set -eux

# find all your files by using a `grep` pattern
pattern="insert_filename_pattern_here" # you must enter your filename pattern here

# create an array of filenames and split on newlines
IFS=$'\n'
tmp=($(ls | grep ${pattern}))
unset IFS

# for each filename
for filename in "${tmp[@]}"; do
    # rename the filename to use "_" character instead of a " " character
    mv -v "${filename}" "${filename// /_}"
done

파일 이름이 5 개 미만인 경우 모든 파일 이름을 수동으로 입력 rename하고 위의 해결 방법 과 같이 명령을 사용할 수 있습니다. 그러나 나를 위해 ... 나는 4 개의 파일 만있을 때조차도 프로그래밍 솔루션을 선호합니다.

추신

Bash의 매개 변수 확장에 익숙하지 않은 경우 다음 명령을 ${filename// /_}사용할 수 있습니다 rename.

if ((0)); then
    mv -v "${filename}" "${filename// /_}"
else
    rename ' ' '_' "${filename}"
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.