하부 디렉토리 포함 파일명 일괄 변경할 수 있는 쉘스크립트 질

milchcow의 이미지

안녕하세요.

리눅스 초짜인 젖소라고 합니다.

오늘 위에서 프로젝트 명이 바꼈다고 서버에 있는 파일명을 일괄 변환하라고 하더군요.

현재 프로젝트명이 K2입니다.

그래서 보통 파일들이 *K2* 이런식의 구조로 되어 있습니다.

요번에 프로젝트명이 T7로 바뀌면서 디렉토리 및 파일들을 전부 *T7*형식으로 변환하라고 하더군요.ㅠ_ㅠ

여기 글 검색해보니 현재 폴더 내에 있는 파일에 대한 변환은 있는데 하부 파일들까지 변환해줄 수 있는 스크립트는 못 찾겠더군요. 거기다가 하부 폴더를 찾아서 모두 탐색하는 루틴만 추가하면 될 것 같은데 감이 잘 안옵니다. 고수님들의 많은 도움 부탁드립니다.

아 참고로 아래 검색한 글에서 현재 폴 내에 있는 파일 이름 변환하는 스크립트는 다음과 같습니다.

ls | sed "s/\(.*\)K2\(.*\)/mv '&' '\1T7\2' /" |sh

keizie의 이미지

저런 스크립트를 만들어 쓰실 정도면 모르실리 없을 텐데.. :?

송효진의 이미지

2개로 짜면 쉬워요.

스크립트1:현재디렉토리의 모든 디렉토리와 파일의 이름을 바꾼다. -maxdepth 1

스크립트2:디렉토리 1 depth 들어가서 스크립트 1을 실행하고 자신을 반복한다.

milchcow의 이미지

kz wrote:
저런 스크립트를 만들어 쓰실 정도면 모르실리 없을 텐데.. :?

kz님 ls -R로 하면 문제가 하나 생깁니다.ㅠㅠ

예를 들어서

현재 폴더에 asdfK2adsf란 파일과 K2asdf라는 폴더가 있습니다.

그리고 K2asdf 폴더 내에는 K2test파일이 있습니다.

그럴 경우 ls -R이라고 입력하면

.:
K2asdf asdfK2adsf

./K2asdf
K2test

이렇게 5줄이 나옵니다.

그리고 ls -R | sed "s/\(.*\)K2\(.*\)/mv '&' '\1T7\2' /" |sh 실행하면 K2asdf 폴더와 asdfK2adsf 파일은 제대로 변경이 됩니다. 그러나 K2test의 경우 현재 폴더내에 K2test라는 파일이 없기 때문에 "그런 파일이나 디렉토리가 없습니다"라고 에러 메시지가 뜨게 됩니다. 제 생각대로 아무래도 디렉토리를 이동하면서 명령어를 실행시키는 방식으로 해야할 것 같습니다.(만약 현재 디렉토리에서 변경한다고 한다면 이미 K2asdf 폴더가 T7asdf로 변경되었기 때문에 이 또한 말썽입니다.ㅠ_ㅠ)

사실 됐으면 했는데.ㅠ_ㅠ이론.

Fe.head의 이미지

$ find . -type d -name "*K2*" -exec rename 's/K2/T7' {} \;
$ find . -type f -name "*K2*" -exec rename 's/K2/T7' {} \;

rename tool이 있어야 합니다.^^
아니면 만드셔도 되고요.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

송효진의 이미지

find 한번에 하부디렉토리명을 모두 바꿀 수 없습니다.
디렉토리명이 바뀌면, 그 다음은 디렉토리가 없다는 오류메세지가 나오게 됩니다.

gentoo.or.kr wiki GnomeLocale 에 euckr 을 utf8 로 고치는 스크립트를 올려두었는데,
위에 적은 스크립트 2개로 구현한 것입니다.

Fe.head의 이미지

송효진 wrote:
find 한번에 하부디렉토리명을 모두 바꿀 수 없습니다.
디렉토리명이 바뀌면, 그 다음은 디렉토리가 없다는 오류메세지가 나오게 됩니다.

gentoo.or.kr wiki GnomeLocale 에 euckr 을 utf8 로 고치는 스크립트를 올려두었는데,
위에 적은 스크립트 2개로 구현한 것입니다.

그렇군요 :oops:

이건 안될까요?

$ find . -type d -name "*K2*" | tac |xargs rename 's/K2/T7/'
$ find . -type f -name "*K2*" -exec rename 's/K2/T7/' {} \;

안되는군요 ㅜ.ㅠ

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

milchcow의 이미지

fehead wrote:
$ find . -type d -name "*K2*" -exec rename 's/K2/T7' {} \;
$ find . -type f -name "*K2*" -exec rename 's/K2/T7' {} \;

rename tool이 있어야 합니다.^^
아니면 만드셔도 되고요.

위에걸로 짜보니 송효진님 말씀처럼 바로 아래단계까지만 변경이 되네요.(일단 송효진님 말씀따라 gentoo linux에 가봤는데 어딘지는 못 찾고 있습니다.-_-;;)

질문은 딴거.-_-;;

제 컴에서 rename K2 T7 *는 동작을 하는데 rename 's/K2/T7' *는 왜 동작을 안하는건가요?ㅠ_ㅠ

milchcow의 이미지

fehead wrote:
송효진 wrote:
find 한번에 하부디렉토리명을 모두 바꿀 수 없습니다.
디렉토리명이 바뀌면, 그 다음은 디렉토리가 없다는 오류메세지가 나오게 됩니다.

gentoo.or.kr wiki GnomeLocale 에 euckr 을 utf8 로 고치는 스크립트를 올려두었는데,
위에 적은 스크립트 2개로 구현한 것입니다.

그렇군요 :oops:

이건 안될까요?

$ find . -type d -name "*K2*" | tac |xargs rename 's/K2/T7/'
$ find . -type f -name "*K2*" -exec rename 's/K2/T7/' {} \;

안되는군요 ㅜ.ㅠ

그것도 해봤는데 안됩니다.ㅠ_ㅠ 그나마 되던 바로 하위 폴더명도 안바뀝니다.ㅠ_ㅠ

Fe.head의 이미지

테스트해봐서 성공 했습니다.

find . -type d -name "*T7*" |tac |xargs rename 's/(\/.*)T7([^\/]*)/$1K2$2/'

아래건 테스트 안해 봤지만 될것 같습니다.^^

$ find . -type f -name "*K2*" -exec rename 's/K2/T7/' {} \; 

약간 수정.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

milchcow의 이미지

fehead wrote:
테스트해봐서 성공 했습니다.

find . -type d -name "*T7*" |tac |xargs rename 's/(\/.*)T7([^\/]*)/$1K2$2/'

아래건 테스트 안해 봤지만 될것 같습니다.^^

$ find . -type f -name "*K2*" -exec rename 's/K2/T7/' {} \; 

약간 수정.

이상하게 제 컴에서는 rename뒤에 인수를 '' 식으로 넣어주면 동작을 안합니다.ㅠ_ㅠ

어떻게 딴 해결법은 없을까요?

송효진의 이미지

지금 보니까 기본 rename 은 정규식이 지원 안되고,
rename 만 패키지가 따로 또 있군요.
이건 정규식 지원 되네요.

Fe.head의 이미지

milchcow wrote:
fehead wrote:
테스트해봐서 성공 했습니다.

find . -type d -name "*T7*" |tac |xargs rename 's/(\/.*)T7([^\/]*)/$1K2$2/'

아래건 테스트 안해 봤지만 될것 같습니다.^^

$ find . -type f -name "*K2*" -exec rename 's/K2/T7/' {} \; 

약간 수정.

이상하게 제 컴에서는 rename뒤에 인수를 '' 식으로 넣어주면 동작을 안합니다.ㅠ_ㅠ

어떻게 딴 해결법은 없을까요?

$ find . -type d -name "*K2*" |tac  > aa.sh
$ vim aa.sh

# vim에서
:%s/^\(.*\)K2\(.*\)$/mv \1K2\2 \1T7\2/g
:wq

$ bash aa.sh

$ find . -type f -name "*K2*" |tac > bb.sh
$ vim bb.sh
# vim에서
:%s/^\(.*\)K2\(.*\)$/mv \1K2\2 \1T7\2/g
:wq
$ bash bb.sh 

무식한 방법입니다. ㅡㅡ;

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.