Linux-파일 이름의 공백 바꾸기


답변:


172

이렇게해야합니다.

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done

이것은 나를 위해 작동하지 않았습니다. 동일한 파일이 존재한다고 주장했습니다 (잘못된 파일 이름). 예를 들어 이름을 바꾸려고하는데 1 - foo.jpg내 폴더가 이미 1.jpg있습니다.
byxor

3
백틱은 따옴표 근처에있을 때 읽기가 조금 어렵습니다. 동일하지만 더 읽기는 것for file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
카밀 S 재론

참고 : 파일 이름을 업데이트하려는 디렉토리의 WITHIN에서 실행됩니다. 양자 택일로, 당신은 변경할 수 있습니다 *PATH_TO_YOUR_DIRECTORY.
CFitz

73

Perl 스타일의 정규식을 사용하는 'rename'명령을 사용하는 것을 선호합니다.

rename "s/ /_/g" *

-n 플래그를 사용하여 테스트 실행을 수행 할 수 있습니다.

rename -n "s/ /_/g" *

3
이 작동합니다 경우 당신은 펄 스타일의 이름 변경이 아닌 단순 레드햇 / 페도라 하나가
데이비드 딘

9
페도라 버전은rename " " "_" *
David Dean

4
renameOSX에서는 사용할 수 없습니다.
Etienne Low-Décarie 2014

macOS 10.12.3에서 rename사용할 수 있습니다.
성 조

1
@DavidDean Arch Linux의 이름 변경은 첫 번째 항목 만 대체합니다 (공백이 여러 개인 파일 / 디렉토리에는 그리 편리하지 않음). 페도라와 동일한 구문을 가지고 있으므로 동일한 것일 수 있습니다. 그러나 perl-rename은 설치할 수 있습니다.
prosoitos

15

사용 sh ...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

방아쇠를 당기기 전에 이것을 시도하려면 mv로 변경 하십시오 echo mv.


4

bash를 사용하는 경우 :

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

시도했을 때 mv : 여러 파일을 이동할 때 마지막 인수는 디렉토리 여야합니다 mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try . 자세한 내용은 mv --help '를 사용 해보세요 .
Mithun Sreedharan

다시 오류 mv : 누락 된 파일 인수 mv --help' for more information. mv: missing file argument Try 자세한 내용은 mv --help '를 시도 하십시오. mv : 누락 된 파일 인수 mv --help' for more information. mv: missing file argument Try 자세한 내용은 mv --help '를 시도 하십시오.
Mithun Sreedharan

@ levislevis85 : Thx, 몰랐습니다.
soulmerge

4

대체 작업을 재귀 적 으로 적용하려면 어떻게해야 합니까? 어떻게 하시겠습니까?

글쎄, 방금 답을 찾았습니다. 가장 우아한 솔루션은 아니지만 (조건을 준수하지 않는 파일의 이름도 변경하려고 시도) 작동합니다. (BTW, 제 경우에는 밑줄이 아닌 '% 20'으로 파일 이름을 변경해야했습니다)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done

2

모든 파일이 .txt라고 가정하여 다음과 같이 시도하십시오.

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done

2
아래 오류가 발생했습니다. tr : mv를 번역 할 때 두 개의 문자열이 제공되어야합니다. 파일 인수가 없습니다. 자세한 내용은`mv --help '를 사용해보십시오.
Mithun Sreedharan

2
Agin error tr : too many arguments tr --help' for more information. mv: missing file argument Try 자세한 내용은 mv --help '를 시도 하십시오.
Mithun Sreedharan

2

다음은 또 다른 해결책입니다.

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. awk를 사용하여 파일 이름 주위에 따옴표를 추가합니다.
  2. sed를 사용하여 공백을 밑줄로 바꿉니다. 따옴표로 원래 이름을 인쇄합니다 (from awk); 다음 대체 이름
  3. xargs는 한 번에 두 줄을 가져 와서 mv에 전달합니다.

1

변수를 인용하십시오.

for file in *; do echo mv "'$file'" "${file// /_}"; done

실제 이름을 변경하려면 "echo"를 제거하십시오.


mv 명령을 제대로 반영하지만 실제로 파일 이름을 바꾸지는 않습니다!
Mithun Sreedharan

에코를 제거하는 MV 같은 오류가 생성 할 수 없습니다 합계 \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \ '1130_1_bedroom_floor_plan.jpg \' ': 해당 파일이나 디렉토리 MV : 할 수 없습니다 합계 \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \'1130_diningroom_table.jpg \ '': 그런 파일이 없습니다 또는 디렉토리
Mithun Sreedharan

Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP (금) 8 월 14 일 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan

1

문자열 (귀하의 경우 공백 문자)을 다른 문자열로 바꾸는 가장 쉬운 방법은를 Linux사용하는 것 sed입니다. 다음과 같이 할 수 있습니다.

sed -i 's/\s/_/g' *

도움이 되었기를 바랍니다.


이것은 질문을 해결하지 않습니다.
amit


0

.py확장자 가있는 모든 파일의 이름을 바꾸려면 find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

샘플 출력,

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.