2015-01-22 2 views
0

먼저이 글은 내가 읽은 일부 게시물의 정확한 복제본이지만 참조하는 데는 아무런 행운이 없다는 것을 알고 싶습니다.sed 및 mv를 사용하여 파일에 문자 추가

나는 모두 매우 엄격한 명명 규칙 인 5_##_<name>.ext을 따른다. 내 문제는 원래이 파일들을 만들 때 5_100_ 이상이 내 주문을 망칠 것임을 깨닫지 못했다는 것이었다.

이제 01과 99 사이의 모든 숫자 앞에 0을 추가하려고합니다. 파일 내용에 대해 작동하는 sed를 사용하여 bash 스크립트를 작성했습니다 (파일 이름도 파일에 있음) :

#!/bin/bash 
for fl in *.tcl; do 

    echo Filename: $fl 

    #sed -i 's/5_\(..\)_/5_0\1_/g' $fl 

done 

그러나 내용 만 변경되며 파일 이름은 변경되지 않습니다. 나는 mv가 해결책이라는 것을 읽었다. (rename은 더 간단하지만 내 시스템에는 없다.) 내 여러 시도의 나의 현재 화신은 다음과 같습니다

mv "$fl" $(echo "$file" | sed -e 's/5_\(..\)_/5_0\1_/g')를하지만 나에게 오류 제공 : mv: missing destination file operand after <filename>

가 다시 말하지만, 나는 중복에 대한 미안하지만 난 그것을 읽어 내 문제를 해결할 수 없습니다입니다. 나는 단지 mvsed의 조합을 잘못 사용하고있을 것이라고 확신합니다.


설명에 의견을 입력했습니다. 나는 $ fl 대신에 $ file을 사용했다. 이 같은

+2

sed --posix를 사용합니다. – Wintermute

+0

나는 문자 그대로 최악이다. 고맙습니다. 이 의견을 답으로 남기려면이 질문을 선택하고 닫는 것이 좋습니다. – Joshua

답변

0

뭔가 유용 할 수 있습니다 :

for n in $(seq 99) 
do 
    prefix2="5_$(printf "%02d" ${n})_" 
    prefix3="5_$(printf "%03d" ${n})_" 

    for f in ${prefix2}*.tcl 
    do 
    suffix="${f#${prefix2}}" 

    [[ -r "${prefix3}${suffix}" ]] || mv "${prefix2}${suffix}" "${prefix3}${suffix}" 

    done 
done 

보다는 모든 단일 파일을 처리, 그것은 단지 현재 "5_XX_"접두사가, 단지 그 이름을 변경하는 사람에서 보이는 경우 해당 "5_XXX_" 파일이 이미 비트와 함께

0
#!/bin/bash 
for fl in *.tcl 
do 
    NewName="$(echo "${fl} | sed '/^5_[0-9]\{2\}_/ s/../&0/')" 
    #echo "Filename: ${fl} -> ${NewName} 

    [ ! "${fl}" = "${NewName}" ] && mv ${fl} ${NewName} 
done 
  • 에게 ... A는 같은 폴더에 몇 시간을 통과 할 수 있도록 securisation 존재하지 않는 (하나를 필요로 변경). 리눅스 (기본적으로 나오지도 않은 POSIX)에서
  • 의`mv` 명령 대신`에코 "$ 파일"`의`에코 "$ 플라이를"`시도 대신에 간단한 sed를 호출