2011-08-11 1 views
0

이름을 바꿀 필요가있는 파일 폴더가 있습니다.배쉬/배치 다중 파일, 단일 폴더, 비실명적 인 이름 변경 스크립트; 사용자 제공 파일 이름 접두사 매개 변수

단순한 부적절한 숫자 재 명명 기능 대신, 먼저 폴더 내에서 파일 이름의 무결성을 보장하기 위해 부각 될 이름 지정 규칙을 제공해야합니다.

Eac-345-018.txt 
Eac-345-019.txt 
Eac-345-020.txt 

내가 이름이 다를 수있는 스크립트를 실행할 때마다 시간과 함께 갈 수있는 숫자 incriment : 필요

wei12346.txt 
wifr5678.txt 
dkgj5678.txt 

가 이름이 변경 될 :

내가 파일이 있다고 가정 해 또한 다를 수 있습니다 :

Ebc-345-010.pdf 
Ebc-345-011.pdf 
Ebc-345-012.pdf 

그래서 나는 사용자로부터 제공된 매개 변수를 요청해야합니다. 이것은 인덱스화할 파일 목록의 이전 파일 이름과 같이 유용 할 수 있다고 생각했습니다. 예 : Eac-345-017.txt

다른 점은 내가 스크립트를 사용하면 스크립트가 099에서 100 또는 999에서 1000으로 나는이 과정이 어떻게 수행되는지 알지 못한다.

필자는이 스크립트가 perl에서 사용하기 쉬운 스크립트이지만 컴퓨터에서 cygwin을 실행 중이고 스크립트를 실행하기 위해 bash와 windows 셸에만 액세스 할 수 있다고 들었습니다.

나를 끌어들일 수있는 모든 포인터는 크게 감사하겠습니다. 프로그래밍 경험이 있지만 스크립팅은 거의 완전히 새로운 것입니다.

감사합니다, 크레이그

(이미 이런 일을 유형에 대한 게시물의 할당한다가 내가 이해하지만 아무도 어떤 간결하게 대답, 따라서 내 질문에 제공하는 것 없음) 다음

답변

0
#!/bin/bash 

prefix="$1" 
shift 

base_n="$1" 
shift 

step="$1" 
shift 

n=$base_n 

for file in "[email protected]" ; do 
    formatted_n=$(printf "%03d" $n) 
    # re-use original file extension whilke we're at it. 
    mv "$file" "${prefix}-${formatted_n}.${file##*.}" 
    let n=n+$step 
done 

이런 식으로 호출, 파일을 저장 :

bash fancy_rename.sh Ebc-345- 10 1 /path/to/files/* 

참고 : 당신이 "이름"는 .txt.pdf A와,하지만 난 추정 위의 확장이 동일하게 유지 것이다 당신의 예에서. 확장 기능을 정말로 바꾸고 싶다면 사소한 변화 일 것입니다. 실제로 파일 형식을 변환하려면 좀 더 복잡 할 것입니다.

또한 %03d으로 증가 숫자의 형식을 지정했습니다. 즉, 숫자 시퀀스는 예 :

010 
011 
012 
... 
099 
100 
101 
... 
999 
1000 

는 패딩 제로 3 곳이 될하지만 것을 의미 자동으로 오버 플로우 수가 큰 경우. 일관성 (항상 4 자리)을 선호하는 경우 패딩을 %04d으로 변경해야합니다.

+0

같은 종류의 오류가 위에 표시되고 있기 때문에 내 cygwin에 문제가있을 수 있다고 생각합니다. 내 집 * nix 상자에서 스크립트를 실행하고 그것을 처리하는 방법을 시도합니다. 나는 단순히 접두사를 바꿔야하는 확장자를 바꾸려고하지 않고있다. 예를 들어 EV1-10-과 같은 이전 접두사를 사용하면 이전 접두사와 같은 초기 접두어를 붙일 수있다. : 0014는 0015에 갈 것이다. 오버 플로우 능력은 매우 높아질 것이다. 잠재적 인 파일 수천을 처리 할 것이기 때문에 문제를 해결하는 데 유용했습니다. 내가 스크립트 변수에 익숙하지 않은 메신저 등 자바는 제 친숙한 언어입니다. 감사합니다 –

+0

@Craig : Windows의 메모장에서 스크립트를 만들고 있습니까? 메모장 및 실제로 대부분의 Windows 기본 텍스트 편집기는 DOS 스타일의 줄 끝으로 텍스트 파일을 저장합니다. Bash는 유닉스 스타일의 라인 엔딩이 필요하다. 파일을 변환하거나이를 수행하는 방법을 이해하는 편집기로 다시 저장하십시오. 사소한 변환 스크립트 :'tr -d '\ r' tmp_file; mv 파일 _file your_script_file'. 나는 notepad2 또는 braindead가 아닌 다른 무료 메모장 workalike를 다운로드하는 것이 좋습니다. 참고 : sh와 bash는 같은 것이 아닙니다! – Sorpigal

+0

나는 notepad ++를 사용하여 만들고있다. –

0

, 당신은 확인을 할 수 있습니다 . 사용자에게 먼저 접두사를 입력 한 다음 시작 순서 번호를 물을 수 있습니다. 그런 다음 bash의 기본 제공 printf을 사용하여 숫자에 올바른 형식을 지정할 수 있지만 모든 시퀀스를 보유 할 수있는 충분한 너비를 제공해야합니다. 그 이유는 더 균질 한 이름을 갖기 때문입니다.

echo -n "Insert the prefix: " 
read prefix 
echo -n "Insert the sequence number: " 
read sn 

for i in * ; do 
    fp=`printf %04d $sn` 
    mv "$i" "$prefix-$fp.txt" 
    sn=`expr $sn + 1` 
done 

참고 : 당신은 사용자의 입력을 읽어 read을 사용할 수 있습니다 또한 확장을 추출 할 수 있습니다. 그것은 문제가되지 않습니다. 또한 여기에서 변수 번호 $fp으로 계산 된 시퀀스 번호에 4 개의 숫자를 선택했습니다.

+0

http://imageshack.us/photo/my-images/854/bashscreen.png/ Cygwin으로 인해 스크립트를 실행할 때 오류가 발생하거나 표준 오류 일 수 있습니까? –

+0

코드도 표시 할 수 있습니까? 이것은 매우 이상한 오류 들이며 아마도 문자 인코딩 (DOS/UNIX)과 관련이있을 수 있습니다. –

+0

이 코드는 엉망입니다. 내가 appologise 할 #!/빈/bash는에게 접두사 = "$ 1" 변화 base_n = "$ 1" 변화 단계 = "$ 1" 변화를 N = "$에있는 파일에 대한 $ base_n @ "; do formatted_n = $ (printf "% 03d"$ n) # 원래 파일 확장명을 그대로 사용하십시오. mv "$ file" "$ {prefix} - $ {formatted_n} $ {file ## *.}" let n = n + $ 스텝 완료 –

관련 문제