2012-06-21 3 views
0

저는 bash에서 여러 파일의 이름을 바꾸려고합니다. 09 (temp_9 to temp_09)까지 예를 들어 temp_1을 temp_01로 이름을 바꾸는 방법은 무엇입니까?bash-scripting을 통해 재귀 적으로 파일의 이름을 바꿀 수 있습니까?

sed를 사용했지만 어떻게 든 작동하지 않았습니다.

은 이걸로 시도 :

for i in temp_?.txt; 
do 
    j=echo $i | sed 's/[^0-9]*/0[^0-9]*/g'; 
    mv "$i" "$j"; 
done 
+2

"[...]하지만 어떻게 든 작동하지 않았습니다"는 분명하지 않습니다. 너 뭐 해봤 니? 무엇이 잘못 되었습니까? – unwind

+0

for temp _? txt; do j ='echo $ i | sed의/[^ 0-9] */0 [^ 0-9] */g "; mv "$ i" "$ j"; done – g256

답변

1

시도가 예를 들어, 경우에 대한 작업을 할 것입니다

sed 's/[0-9]/0&/' 

처럼 뭔가에 sed 명령을 수정할 수 있습니다.

실제로 일치하지 않는 문자열을 참조하려고 할 때 명령이 작동하지 않습니다. & (전체 일치) 또는 references으로 끝났기 때문에 명령이 작동하지 않습니다.

+0

알았습니다. 감사. – g256

+0

@LevLevitsky 걱정할 필요가 없습니다. 지금이 순간을 완벽하게 할 시간이 없지만, 이것들의 줄에서 뭔가가 작동해야하고 조금 더 작아 져야한다고 생각합니다. rename 's/(temp _) ([0-9])/\ 10 \ 2/g 'temp _? txt' – Miquel

+0

@LevLevitsky 바로 지금 내가 temp_1_25와 비슷한 것을 가지고 있다면 25에 영향을 미친다는 것을 깨달으십시오. 1이있는 위치에 변경 사항을 적용하는 방법은 무엇입니까? 감사. – g256

0

backticks 또는 $(...) 안에 넣어야하는 sed 출력을 캡처하지 않기 때문에 작동하지 않습니다. 내가 확장 정규 표현식에 대한 sed에 -E 옵션을 사용하는 것을 선호하지만 sed가 지원하는 경우 나도 몰라 :

for i in temp_?.txt 
do 
    j=$(echo $i | sed 's/\([0-9]\{1,\}\)/0\1/g') 
    mv "$i" "$j" 
done 

참고 : 게다가, 당신의 RE 잘못이 시도.

+0

그들은 백틱으로 있습니다. –

1

sed 필요 없음; 단지 파일 이름에 대해 당신이 알고있는 것을 사용

for i in {0..9} 
do 
    mv temp_$i.txt temp_0$i.txt 
done 
0

당신이하지 않는 한 또한

j=`echo echo $i | sed 's/[^0-9]*/0[^0-9]*/g'` 

, 당신은 각 문장의 끝에 세미콜론이 필요하지 않습니다 당신의 변수 할당 탈출해야합니다 한 줄의 모든 작업

관련 문제