2014-02-16 3 views
1

206,372 개 파일의 이름을 바꾸려면 현재 이름이 Minecraft (03)_206372.tga이고 파일 이름은 어떻게 처리됩니까?일괄 이름 바꾸기 200000 개 파일

나는 내가하고있는 일에 대한 생각을 가지고 있지만 내가하고있는 일을 확신하고 싶습니다. 지금까지이 명령은 206372.tga을 인쇄하는 명령

ls Minecraft\ \(03)\)_206372.tga | awk -F'_' '{print $2}' 

에게 있습니다. 그게 내가 원하는 것을 수행하지만, 동시에 200,000 개가 넘는 파일 이름을 바꾸고 싶습니다. 누군가 명령을 끝내도록 도울 수 있습니까?

+1

파일의 위치 구조는 무엇입니까? 대부분 당신은 그냥 [tag : find]를 가지고'$ {file ## * _} '을 실행하려고합니다. – BroSlow

답변

1

뭔가를 시도

#!/bin/sh 
dir=$0 
for file in `find $dir -name blah_\*.tga`; do 
    newfile=`echo $file | sed 's/blah_//'` 
    my $file $newfile 
done 

파일 시스템에 따라, 당신은을받을 수 있습니다 디렉토리에서 너무 많은 파일을 사용하고 많은 변경을하는 것에서 성능이 크게 변경되었습니다. "찾기"사용에 대한

주 :

  • 찾을 사용할 필요가 완전히 같이 Recurse, 또한 당신이 찾을 수있는 "-maxdepth 1"옵션을 추가 할 수 있습니다 할 필요가없는 경우,
  • 또한 모든 파일 이름의 총 길이가 너무 길면 명령 줄을 너무 길게 만들 수 있으므로 glob가있는 파일을 찾지 못할 수도 있습니다.
+0

이 명령은 훌륭하게 작동했습니다! 고맙습니다. :) –

+0

@WhitequillRiclo 대단합니다. 다행 이네. :) –

+0

@jaypal singh는 아마도'$ {file ## * _}'을 설명 할 수 있습니까? 단계별로? 감사합니다 – MLSC

0

그냥 펄 정규식을 사용하는 rename 명령을 사용하십시오.
rename 's/Minecraft \(03\)_//' *.tga
".tga"로 끝나는 모든 파일에서 "Minecraft (03) _"을 빈 문자열로 바꿉니다. 이것은 약간의 폭력,하지만 이해할 방법은 파일에서 접두어를 제거

for file in Minecraft*.tga ; do 
    mv "$file" "${file##*_}" 
done 
+0

인수 목록이 너무 길다고합니다. –

+0

죄송합니다. 나는 단지 몇 개의 파일에 대해서만 테스트를했다. (Stupid me) – McLovin

0

:

+0

'#!/bin/sh'의 더 이상 사용하지 않아야합니다. 시스템에 따라 많이 다릅니다. 또한 대부분의 셸은 [tag : find]의 출력을 버퍼링하려고 시도 할 것이라고 생각합니다. 많은 수의 파일에 대해 버퍼 오버 플로우가 발생할 확률이 높으며 동시에 읽을 때 'while/read'를 추가해야합니다. – BroSlow

+0

@BroSlow shebang은 스크립트가 대상으로하는 쉘을 표시하는 좋은 방법입니다. 네가 전혀 예찬을 제안하지 않는다는 것을 믿을 수 없다. 그래서 자네가 그 장소에서 추천하는 것은 무엇입니까? –

+0

@ MarkSetchell 당신이 내 포인트를 놓친 것 같아요. '#!/bin/sh'는 잘 정의되지 않았고, 어떤 시스템에서는 bourne shell을 의미 할 것이고, 다른 사람들에게는 돌진을하고, 다른 사람들에게는 bash를 의미 할 것입니다. – BroSlow

관련 문제