파일 이름을 바꾸고 문자를 바꾸는 방법?


11

:이름 안에 (콜론) 이있는 파일 그룹이 있습니다 . 나는를 교체 할 필요가 :-(대시).

스크립트에서이 작업을 수행하는 쉬운 방법이 있습니까?

샘플 파일 이름 : 2013-10-11:11:52:08_055456663_045585_.txt

답변:


17

간단한 1- 라이너가해야합니다 (Posix sh호환 쉘을 가정 ) :

for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done

설명:

  • for ... in ...; do ...; doneA는 루프

  • *:* 현재 디렉토리 :의 이름 에있는 모든 파일 및 디렉토리 와 일치

  • f 루프에서 이러한 각 파일 이름에 차례로 할당됩니다.

  • mv첫 번째 인수를 두 번째 인수로 이름을 바꿉니다. -v(자세한 내용)은 자신이하는 일을 인쇄하도록 요청합니다. 이 옵션은 GNU-utils에 따라 다르므로 Linux에서는 사용할 수 있지만 Solaris에서는 사용할 수 없습니다

  • $(...) 서브 쉘에서 코드를 실행하고 출력을 대체

  • echo 인수를 표준 출력에 인쇄합니다

  • tr 제공된 맵에 따라 표준 출력을 읽고 문자를 번역합니다.

당신이 사용하는 경우 bash는 , 당신은 여분의 쉘 (산란을 방지 할 수 있습니다 $()하위 프로세스와을 () tr로 대체하여) $(...)와 함께 ${f//:/-}.


간단한 작업 답변은 +1이지만 조금 더 설명하면됩니다. 예를 들어 for f in... 루프는 파일이 일치해야하는 현재 디렉토리의 모든 파일을 반복하는 루프입니다 *:*. (일치하는 디렉토리는 어떻게됩니까?) move 명령은으로 쉘을 실행하여 새 이름이 생성되는 move oldname newname입니다 $( subshell here ). tr이하는 일, ...
Hennes

@Hennes : 이것은 수퍼 유저입니다. 이런 종류의 세부 사항에 정말로 들어가야합니까? 오 잘, 여기 당신은 간다
sds

아니요. 실제로 필요한 것이 있다면 +1하지 않았을 것입니다. 그리고 나는 그것이 무엇을하는지 이해합니다. 나는 다른 많은 독자들에게도 좋다고 생각합니다.
Hennes

2
당신은 대체 할 수있는 $(echo "$f" | tr ':' '-')과를 "${f//:/-}"하고 서브 쉘, 파이프 및 외부 프로그램 호출을 피하십시오. 나는 이것이 bashism이라고 생각하지만, eh. 여기를 참조하십시오 .
evilsoup

@evilsoup 실제로; 작은 데이터 세트에는 큰 차이가 없지만 (가독성을 선호 할 수는 있지만) 그와 같은 것이 얼마나 빠른지 놀랄 것입니다. 나는 최근에 조금 물었다. 두 개의 간단한 문자열 마사지 명령이 더 이상 필요하지 않도록 스크립트를 다시 작성하여 실행 시간을 90 % 이상 쉽게 단축 할 있었습니다 . 이는 큰 데이터 세트에서 몇 분의 벽시계 실행 시간으로 변환되었습니다.
CVn

6

다른 게시물에서 언급 했듯이이 rename도구는 당신을 위해 속임수를 쓸 수 있습니다. 다음 rename s/:/-/ <files to rename> 과 같이 입력하면됩니다. 이것은 모든 콜론을 마지막에 이름을 지정한 모든 파일에서 대시로 바꿉니다.2013-10-*

여기 내 다른 게시물에 대한 링크가 있습니다


1

유닉스 전문가가 bash 로이 작업을 수행 할 수 있다고 확신하지만 루비가있는 빠르고 더러운 버전이 있습니다.

path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
  `mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end

path_to_files를 이름이 잘못된 파일의 경로로 설정하십시오. 위의 코드를 rename.rb라는 파일에 저장 한 다음 :

username@machinename$ ruby rename.rb

@sds는 훨씬 더 나은 답변을 제공합니다. 답변을 삭제해야합니까? 나는 stackoverflow를 처음 사용합니다.
shupru

1
아니; 여전히 중요한 가치가 있습니다. :)
Blacklight Shining

2
그러나이 답변에는 몇 가지 주요 단점이 있지만 관련 이 있을 수 있으며 반드시 알아야 할 가치가 있습니다. (여전히 유용 할 수도 있지만 주의를 기울여야 합니다.) 주로 파일 이름에 공백이있는 파일 이름 (일반적인 실패 사례 줄 바꿈이 아님)을 발견하면 나빠질 것 같습니다. 또한 공백이 아니더라도 쉘 호출에서 파일 이름을 인용하여 파일 이름의 다른 특수 문자를 쉘이 처리하지 못하도록 보호해야합니다 (루비의 백틱 연산자가 어떻게 작동하는지 정확히 알지는 못하지만) ).
CVn

1

하나 또는 몇 개의 파일 만 있으면 이름을 바꿀 수 있습니다.

  1. 대상으로하는 파일 이름의 패턴을 변수로 저장하십시오 p="201*".
  2. 이름 을 바꾸려 는 이전 파일 이름 을 저장하십시오 old_name=$(ls | grep $p).
  3. 필요한 문자 교체와 함께 새 파일 이름 을 저장하십시오 .

    new_name=$(ls | grep $p | sed 's/:/_/g')        # Using 'sed'
    
                OR
    
    new_name=$(ls | grep $p | tr ':' '_')           # Using 'tr'
    

보너스 정리 :
  a. 균일 성을 위해 대시 (-)와 콜론 (:)을 밑줄 (_)로 바꾸려면 다음과 같이하십시오.

    new_name=$(ls | grep $p | tr ':-' '_');

  비. 마지막 밑줄 () 바로 가기를 원하면 variable을 다음과 같이 .txt설정 new_name하십시오.

    new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
  1. 이제 필요에 따라 파일 이름을 바꾸십시오. mv $old_name $new_name

         NB : mv이름 바꾸기 작업에서 파일 이름이 있으면 실패 spaces합니다. 이 경우 다음과 같이 적절한 변수를 따옴표로 묶으십시오.
mv "$old_name" $new_name OR mv $old_name "$new_name" OR mv "$old_name" "$new_name"


원 라이너

1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name

1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name

2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name

3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name

0

이름 바꾸기를 사용하여 :

$ renamer --find ":" --replace "-" *

파일 이름 바꾸기를 위해 완전한 node.js 환경을 설치하는 것이 약간 너무 많다고 생각합니다. rename많은 리눅스 배포판에 사전 설치된 도구입니다. 그러나 Windows의 경우이 도구가 훌륭하다고 생각합니다.
noggerl

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.