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


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.