UNIX 상에서 파일의 부분 변경하는 법을 가르쳐 주시면 감사하겠

ososoi의 이미지

[상사왈] 이 문서 안에 우리 회사 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 군이 해결해야하는 이문제.. 좀 도와주세요~^^;

감사합니다.

익명 사용자의 이미지

emacs 를 쓰신다면 dired-mode 에서 쉽게 수정이 가능합니다.
그외 다른방법들은 다음분이..

ssehoony의 이미지

여러번 사용하실거면 쉘스크립트로 만드시면 좋을 듯 한데
한번만 할거라면
# 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

를 해서 실행하면 되겠네요.

alee의 이미지

ls cus* | sed -e 's/cus\(.*\)/mv cus\1 VIP\1/' | sh

정도면 될 것 같은데요?

kall의 이미지

http://bbs.kldp.org/viewtopic.php?p=138696#138696

rename 's/cus/VIP/' *.txt

#!/usr/bin/perl -w
#
#  This script was developed by Robin Barker (Robin.Barker@npl.co.uk),
#  from Larry Wall's original script eg/rename from the perl source.
#
#  This script is free software; you can redistribute it and/or modify it
#  under the same terms as Perl itself.
#

use strict;

use Getopt::Long;
Getopt::Long::Configure('bundling');

my ($verbose, $no_act, $force, $op);

die "Usage: rename [-v] [-n] [-f] perlexpr [filenames]\n"
    unless GetOptions(
    'v|verbose' => \$verbose,
    'n|no-act'  => \$no_act,
    'f|force'   => \$force,
    ) and $op = shift;

$verbose++ if $no_act;

if (!@ARGV) {
    print "reading filenames from STDIN\n" if $verbose;
    @ARGV = <STDIN>;
    chop(@ARGV);
}

for (@ARGV) {
    my $was = $_;
    eval $op;
    die $@ if $@;
    next if $was eq $_; # ignore quietly
    if (-e $_ and !$force)
    {
    warn  "$was not renamed: $_ already exists\n";
    }
    elsif ($no_act or rename $was, $_)
    {
    print "$was renamed as $_\n" if $verbose;
    }
    else
    {
    warn  "Can't rename $was $_: $!\n";
    }
}

----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ

agkrwyasym의 이미지

ls -1 | awk -F_ '{print "mv cus_"$2" VIP_"$2}' | sh

ososoi의 이미지

많은 도움 주셔서 감사합니다.

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

답변 달아주신 모든분들 다 정답일꺼라 생각됩니다. 다만 제가 잘 못해서 해답을 얻지 못한 것이겠지요. 그럼 무더운 여름 더위 조심하세요~ 또 찾아뵙겠습니다.ㅎ

こんなわたしが ひとをあいせる
이런 내가 사람을 사랑할수있다는

ことがうれしくて
것이 기뻐서,

うれしなみだがホロリ ためいきといっしょに
기쁨의 눈물이 한숨과 함께 흐르는군요.

- うれしなみだ

io2oi의 이미지

]$ for f in cus_*.txt; do mv $f VIP${f#cus}; done

${parpm#word}는 처음부터 word와 맞는 paramd의 최소 부분을 제거하고 나머지를 반환하는 방법이라고 초보자용리눅스프로그래밍책에 나와있네요.

혹시불안하시면 위의 mv를 cp로 바꾸어서 한 뒤에 나중에 다시
]$ rm cus_*.txt
하시면 될듯합니다.

맞는 답변이길 바래요

Prentice의 이미지

for I in `seq -w 1000` ; do mv cus_$I.txt VIP_$I.txt ; done

`는 backtick입니다. 1 왼쪽에 있는 문자요.

alee의 이미지

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를 붙여서 다시 한 번 실행해 주면 됩니다.

rhizome의 이미지

rename이라는 펄스크립트가 있습니다. 깔려 있다면 그걸 쓰시는 게 편할 것 같은데요. 아래 코드 태크로 묶인 내용은 man page인데 끝에 보면 예가 나와 있습니다. 사용법은 그걸 참고하시면 될 듯 싶습니다.

NAME
       rename - renames multiple files

SYNOPSIS
       rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified
       as the first argument.  The perlexpr argument is a Perl expression
       which is expected to modify the $_ string in Perl for at least some of
       the filenames specified.  If a given filename is not modified by the
       expression, it will not be renamed.  If no filenames are given on the
       command line, filenames will be read via standard input.

       For example, to rename all files matching "*.bak" to strip the exten-
       sion, you might say

               rename 's/\.bak$//' *.bak

       To translate uppercase names to lower, you'd use

               rename 'y/A-Z/a-z/' *

거짓말이 없다는 것은 현대성보다도 사상보다도
백배나 더 중요한 일이다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.