UNIX 상에서 파일의 부분 변경하는 법을 가르쳐 주시면 감사하겠
글쓴이: ososoi / 작성시간: 월, 2005/07/25 - 12:31오후
[상사왈] 이 문서 안에 우리 회사 VIP고객 1000명의 명단이 들어있네. 이번에 전산화 작업을 하는 김에 이 1000명의 명단을 컴퓨터로 작성해서 파일로 보관하게. 그리고 파일명은 cus_0001.txt 로 시작해야하네~
라고 XX같은 상사님께서 지령을 내리셨다.
그래서 lol 군은 X꼬에서 피나도록 열을 올린 끝에 32시간 38분 24초만에 1000명분의 문서를 파일로 작성하였다.
며칠뒤...
[상사왈] lol 군 내가 파일명을 잘못 갈켜줬네.. 그 문서의 고객은 VIP아닌가.. VIP로 모셔야지~ 파일명을 바꾸게. VIP_0001.txt 로....
이제 난관에 부딪혔다..
1. 1000개의 파일을 mv cus_0001.txt VIP_0001.txt
- 이 뒤의 이야기는 더이상 ...
2. 쉘스크립트를 작성한다.
3. 프롬프트상에서 바로 변경할 수 있는 방법?
lol 군이 해결해야하는 이문제.. 좀 도와주세요~^^;
감사합니다.
Forums:
emacs 를 쓰신다면 dired-mode 에서 쉽게 수정이 가능합니다.
emacs 를 쓰신다면 dired-mode 에서 쉽게 수정이 가능합니다.
그외 다른방법들은 다음분이..
여러번 사용하실거면 쉘스크립트로 만드시면 좋을 듯 한데한번만 할거라면
여러번 사용하실거면 쉘스크립트로 만드시면 좋을 듯 한데
한번만 할거라면
# ls | vi -
하신다음
vi 안에서
%s/cus_\([0-9]*\).txt/mv \0 VIP_\1.txt/g
이런식으로 정규표현식을 이용한 replace 를 하시면 되겠네요.
이런식으로 mv 명령을 만든 다음
:wrename.sh
로 해서 rename.sh 파일로 저장후
# chmod 755 rename.sh
를 해서 실행 권한을 준후에
# ./rename.sh
를 해서 실행하면 되겠네요.
ls cus* | sed -e 's/cus\(.*\)/mv cus\1 V
ls cus* | sed -e 's/cus\(.*\)/mv cus\1 VIP\1/' | sh
정도면 될 것 같은데요?
http://bbs.kldp.org/viewtopic.php?p=1386
http://bbs.kldp.org/viewtopic.php?p=138696#138696
----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ
ls -1 | awk -F_ '{print "mv cus_"$2" VIP
ls -1 | awk -F_ '{print "mv cus_"$2" VIP_"$2}' | sh
감사합니다.
많은 도움 주셔서 감사합니다.
dankunwizard님께서 주신 답변을 실행해 본 결과...
>ls -1 | awk -F_ '{print "mv 2"$2" 1"$2}' | sh
이렇게 수행한 결과는..
mv 0653-401 2의 이름을 1(으)로 바꿀수 없습니다.
경로 이름에 있는 파일이나 디렉토리가 존재하지 않습니다.
... 반복.
해서 나오더군요.
제가 쌩 초보자라서 그런지.. 음.. 책하나 사서 공부해야 할듯..
kall님의 답변은 길어서 ... 다시 천천히 한번 봐야겠군요.
ssehoony님 답변은 제가 잘 이해를 못한것인지.. 잘 안되더군요.^^;
손님 께서 갈켜주신 emacs .. 이게 먼지 모릅니다. ^^; 이제 막 시작하는 초보라서. 죄송합니다.
마지막으로 alee님 께서 가르쳐 주신대로 해보니.. 한방에 되더군요. 오웃.. 몇시간동안 인터넷 에서 찾아보고 이런저런 방법 쓰다가 실패 했었는데 감사합니다.
그리고 한가지 더.. 어떻게 수행이 되는 것인지 아래의 정확한 해석을 해주신다면 감사하겠습니다. ^^;
ls cus* | sed -e 's/cus\(.*\)/mv cus\1 VIP\1/' | sh
답변 달아주신 모든분들 다 정답일꺼라 생각됩니다. 다만 제가 잘 못해서 해답을 얻지 못한 것이겠지요. 그럼 무더운 여름 더위 조심하세요~ 또 찾아뵙겠습니다.ㅎ
こんなわたしが ひとをあいせる
이런 내가 사람을 사랑할수있다는
ことがうれしくて
것이 기뻐서,
うれしなみだがホロリ ためいきといっしょに
기쁨의 눈물이 한숨과 함께 흐르는군요.
- うれしなみだ
이렇게 하면 되지 않나요?
]$ for f in cus_*.txt; do mv $f VIP${f#cus}; done
${parpm#word}는 처음부터 word와 맞는 paramd의 최소 부분을 제거하고 나머지를 반환하는 방법이라고 초보자용리눅스프로그래밍책에 나와있네요.
혹시불안하시면 위의 mv를 cp로 바꾸어서 한 뒤에 나중에 다시
]$ rm cus_*.txt
하시면 될듯합니다.
맞는 답변이길 바래요
for I in `seq -w 1000` ; do mv cus_$I.tx
for I in `seq -w 1000` ; do mv cus_$I.txt VIP_$I.txt ; done
`는 backtick입니다. 1 왼쪽에 있는 문자요.
ls cus* | sed -e 's/cus\(.*\)/mv cus\1 V
ls cus* | sed -e 's/cus\(.*\)/mv cus\1 VIP\1/'
일단 여기까지만 보면, ls cus* 의 결과를 sed로 보내서,
“cus\(.*\)” 를
“mv cus\1 VIP\1” 로 치환하는 명령입니다.
\1은 \(와 \) 사이에 있는 내용으로 대체됩니다.
예를 들어 ls의 결과가
“cus_0001.txt” 라면,
“mv cus_0001.txst VIP_0001.txt” 로 바뀝니다.
마지막으로, |sh 는 붙이면 sed로 치환된 결과를 출력하는 대신에 바로 쉘로 실행하라는 뜻입니다.
바로 실행해 버리기가 좀 불안하다면 일단 |sh를 생략하고 실행해 본 다음 명령어가 제대로 나오면 |sh를 붙여서 다시 한 번 실행해 주면 됩니다.
rename
rename이라는 펄스크립트가 있습니다. 깔려 있다면 그걸 쓰시는 게 편할 것 같은데요. 아래 코드 태크로 묶인 내용은 man page인데 끝에 보면 예가 나와 있습니다. 사용법은 그걸 참고하시면 될 듯 싶습니다.
거짓말이 없다는 것은 현대성보다도 사상보다도
백배나 더 중요한 일이다.
댓글 달기