파일 그룹 (Filename *)을 백업 (Filename * .bak)으로 복사


13

배경

Linux에서는 다음을 수행 할 수 있습니다.

  • 파일 그룹을 나열 ls Filename*
  • 파일 그룹 제거 rm Filename*
  • 파일 그룹을 mv Filename* /New/Directory
  • 그러나 다음 을 사용 하여 파일 그룹을 복사 할 수 없습니다 .cp Filename* *.bak

cp파일 그룹을 복사하도록 Linux 명령 변경

이름을 하나씩 입력하지 않고 cp명령을 사용하지 않고 복사하려는 파일 그룹이 있습니다 .

$ ls gmail-meta3*
gmail-meta3                          gmail-meta3-REC-1558392194-26467821
gmail-meta3-LAB-1558392194-26467821  gmail-meta3-YAD-1558392194-26467821

이전 DOS 명령과 같은 것을 어떻게 사용할 수 copy gmail-meta3* *.bak있습니까?

비슷한 명령을 네 번 입력하고 싶지 않습니다.

cp gmail-meta3-LAB-1558392194-26467821 gmail-meta3-LAB-1558392194-26467821.bak

하드 코드 된 파일 이름이 아닌 이전 및 새 파일 이름 그룹에 대한 매개 변수를 허용하는 스크립트 / 함수 / 앱을 찾고 있습니다. 예를 들어, 사용자는 다음을 입력 할 수 있습니다.

copy gmail-meta3* *.bak

또는 다음을 입력 할 수 있습니다.

copy gmail-meta3* save-*

1
이 문제는 glob 연산자를 두 번 사용하여 다른 명령을 사용하지 않는 것으로 보입니다. bash는 그것을 처리하기에 충분하지 않습니다.
qwr

2
@qwr, bash는 메타 문자를 확장하고 실행 명령으로 전달하기 전에 입력을 토큰 화한다는 사실은 UNIX 쉘 디자인의 일부입니다. 어떻게 든 cp 명령에 대한 예외를 시도하고 프로그래밍하면 bash의 전체 일관성이 깨지므로 전혀 똑똑하지 않습니다. 연습으로, 여기서 무슨 일이 일어나고 있는지 그리고 왜 그렇게하는 것이 쉘의 메타 문자 확장인지 알아보십시오.touch aa ab ba; mkdir bb; cp a* b*; ls *
Mike S

@MikeS 포인터에 감사드립니다. 어제 다른 사람 *이 소스 파일 이름 에는 와일드 카드 를 사용할 수 있지만 대상 파일 이름 에는 와일드 카드 를 사용할 수 없다고 말했습니다 . 대체 와일드 카드와 같은 ( ##제안되었지만 생각 %하고 있습니다) 대상에 사용해야합니다. 나는 이것이 당신이 강화하고 있다고 생각합니까? 나는 cp명령을 전혀 바꿀 것으로 기대하지 않았다 . copyDOS 복사 명령을 에뮬레이트 한 래퍼 스크립트를 작성하십시오 .
WinEunuuchs2Unix

@ WinEunuuchs2Unix 그 사람이 맞았습니다. 쉘 메타 문자는 명령과 무관합니다. 따라서 모든 와일드 카드는 패턴과 일치하는 모든 파일을 시도하고 일치시킵니다. 범용 "모든 것을 일치시키고 그들이 무엇이든간에 복사하지만이 접미사를 추가하십시오"프로그램을 만들려고한다면 이스케이프 처리되지 않은 메타 문자를 대상으로 지정하면 아마도 원하는 것을하지 않을 것입니다. 쉘 명령 행의 모든 메타 문자가 확장 되기 때문 입니다. 대상 메타 문자가 절대로 일치하지 않는다는 것을 알고 있다면 쉘을 확장 할 수 없기 때문에이를 사용할 수 있습니다.
Mike S

...하지만 그것은 추악한 일입니다. 특수 문자를 사용하는 것이 좋습니다. % 또는 밑줄은 좋으며 일반적으로 메타 문자가 아닙니다 (그러나 crontab 파일에서 %를 사용하는 것에주의하십시오. 특별합니다).
Mike S

답변:


14

다음은 sed이 작업에 적용 할 수있는 비정형 사용의 예입니다 .

sed -i.bak '' file-prefix*

이 방법으로 실제로 sed명령을 제공하지 않았기 때문에 파일을 변경하지 않지만 ''옵션으로 인해 -i[suffix]각 파일의 백업 사본을 만듭니다. 검색 할 때이 방법을 찾았 습니다. 이름을 두 번 입력하지 않고 파일의 백업 복사본을 만들 수있는 방법이 있습니까?


참고 : $ time sed -i.bak '' gmail-meta3*=real 0m0.069s
WinEunuuchs2Unix

파일이 이미 존재하는 경우 : real 0m0.037s. 파일이 삭제되고 cp속도에 가까운 두 번째로 실행되는 경우 : real 0m0.051s.
WinEunuuchs2Unix 2016 년

@xiota 흥미로운 점. 턴 아웃 sed대상 파일이 이미 존재하는 경우 빠른하지만 cp대상 파일이 존재하는 경우 느립니다. 실제로 sync대규모 타이밍 테스트를 수행 할 때가 아니라 캐시와 버퍼를 실제로 플러시 하지만 이번에는 수행하지 않았습니다. 이것은 완전히 다른 논외 주제 드라마로 나눌 수 있기 때문에 테스트 결과를 공유하는 것을 후회합니다 : (이 대화가 결코 발생하지 않은 척하기에는 너무 늦습니까? 또한 하드 디스크가 아니며 4 채널의 Samsung Pro 960 NVMe SSD입니다
WinEunuuchs2Unix

1
Linux 시스템에서 이러한 테스트를 수행하는 경우 이러한 테스트를 위해 어떤 저장 장치를 가지고 있는지는 중요하지 않습니다. 커널은 메모리에서 파일을 버퍼링하는 데 매우 능숙합니다. 이것이 free명령을 사용할 때 "buff / cache"값입니다 . 장치의 실제 쓰기는 캐시의 수명과 시스템의 메모리 압력을 고려한 알고리즘에 의해 선택된 순간에 발생합니다. 여러 테스트를 시도하는 경우 첫 번째 파일 읽기는 디스크에서 나오지만 후속 읽기는 메모리에서 곧바로 나올 것입니다 (참조 sync; echo 3 > /proc/sys/vm/drop_caches).
Mike S

어제 2GB가 넘는 대용량 파일로 몇 가지 테스트를 수행했으며이 방법은 cp명령을 사용하는 것보다 상대적으로 느리지 만 성능에 큰 차이가 있다고 말할 수는 없습니다 .
pa4080

13

당신은 사용할 수 있습니다 find:

find . -max-depth 1 -name 'gmail-meta3*' -exec cp "{}" "{}.bak" \;

그것은 현재 디렉토리 .에서 glob 패턴과 일치하는 이름을 가진 모든 파일을 찾을 것 입니다 (쉘 globbing을 방지하기 위해 패턴 주위에 작은 따옴표를 명심하십시오). 발견 된 각 파일에 대해 cp이름에서 name.bak로 실행 됩니다. \; 결국에는 모든 파일을 한 번에 전달하는 대신 개별적으로 각 파일을 수행합니다. 최대 깊이 1은 되풀이되지 않고 cuurent 디렉토리 만 검색합니다.


1
find . -max-depth 1 -name '"$1"'' -exec cp "{}" "{}$2" \;$ 1이 소스이고 $ 2가 확장 인 경우 에도 작동 합니까?
WinEunuuchs2Unix

합리적이라면 $ 2로 대체해도됩니다. 작은 따옴표 안에 변수를 대체 할 수 없으므로 $ 1이 더 까다로울 수 있습니다. 확실하지는 않지만 패턴이 문자열에 저장되므로 $ 1을 큰 따옴표로 사용할 수 있습니다.
cbojar

11

for와 루프를bash 사용할 수 있습니다 . 일반적으로, 나는 종종 수행하는 작업이 아니기 때문에 하나의 라이너로 입력합니다.

for f in test* ; do cp -a "$f" "prefix-${f}.ext" ; done

그러나 스크립트로 필요한 경우 :

cps() {
   [ $# -lt 2 ] && echo "Usage: cps REGEXP FILES..." && return 1

   PATTERN="$1" ; shift

   for file in "$@" ; do
      file_dirname=`dirname "$file"`
      file_name=`basename "$file"`
      file_newname=`echo "$file_name" | sed "$PATTERN"`

      if [[ -f "$file" ]] && [[ ! -e "${file_dirname}/${file_newname}" ]] ; then
         cp -a "$file" "${file_dirname}/${file_newname}"
      else
         echo "Error: $file -> ${file_dirname}/${file_newname}"
      fi
   done
}

사용법은와 비슷합니다 rename. 테스트하려면 :

pushd /tmp
mkdir tmp2
touch tmp2/test{001..100}     # create test files
ls tmp2
cps 's@^@prefix-@ ; s@$@.bak@' tmp2/test*    # create backups
cps 's@$@.bak@' tmp2/test*    # more backups ... will display errors
ls tmp2
\rm -r tmp2                   # cleanup
popd

참고 : $ time for f in gmail-meta3* ; do cp -a "$f" "${f}.bak" ; done=real 0m0.046s
WinEunuuchs2Unix 2016 년

음, 저는 시간을 최적화하고 싶지 않습니다. 그것은는 0.046인간의 인식 0 초를 의미 초. 방금 게시 된 답변을 테스트하고 흥미로운 sed명령을 따라 위 의 명령 을 본 시청자에게 전달하는 방법을 보여 주려고했습니다 . 또는 적어도 나는 비교에 관심 sedcp...
WinEunuuchs2Unix

솔루션 cp은 솔루션보다 빠릅니다 sed. 그래서 축하의 원인입니다 :)
WinEunuuchs2Unix 2016 년

(1)  -a은 비표준 테스트 운영자입니다. 왜 사용하지 -e않습니까? (2)“임시 디렉토리를 만들 수 없습니다.” 다소 오해의 소지가있는 오류 메시지입니다. (3) 왜 사용하지 mktemp -d않습니까? (4) 종료 상태를 테스트해야합니다. 예를 들어, ! mkdir "$FOLDER" && echo "Unable to create temporary directory." && return 1 또는  을 말해야 mkdir "$FOLDER" || { echo "Unable to create temporary directory."; return 1;}합니다. 마찬가지로 cpand  rename(그리고 아마도 pushd조심하고 싶다면). … (계속)
G-Man, 'Reinstate

(계속)… (5) Arrggghhhh! 말하지 마라 $@. 말한다 "$@". (5B)  가 사용할 필요가 없습니다 {그리고 } 당신이 변수 당신이하고있는 방법을 참조 (시 "${FOLDER}",  "${PATTERN}" 및  "${file}"); 단지 할 "$FOLDER",  "$PATTERN" 하고  "$file". (6) 파일이 현재 디렉토리에 있다고 가정합니다.  cps 's/$/.bak/' d/foo이 아닌 현재 디렉토리에 복사 d/foo합니다 . foo.bak d/foo.bak
G-남자 '는 분석 재개 모니카'말한다

6

DOS 패러다임에 가장 가까운 것은 mcp( mmv패키지에서) :

mcp 'gmail-meta3*' 'gmail-meta3#1.bak'

zsh사용 가능한 경우 , 기여한 zmv모듈이 약간 더 가깝습니다.

autoload -U zmv

zmv -C '(gmail-meta3*)' '$1.bak'

나는 공백을 피할 수있는 자신의 대답ls 에 대한 변형 (줄 바꿈 포함)을 피할 수 있습니다.

printf '%s\0' gmail-meta3* | while IFS= read -r -d '' f; do cp -a -- "$f" "$f.bak"; done

또는 아마도

printf '%s\0' gmail-meta3* | xargs -0 -I{} cp -a -- {} {}.bak

mmv패키지는 이해 하지만 주석에서는 명령이 있다고 말하지만 mcp사용 mmv하는 명령에는 mmv패키지 의 명령이기도 합니다. 나는 printf예제 의 방향을 좋아하고 세련된 스크립트에서 $ 1과 $ 2가 통과되도록합니다. 공 구르기를위한 +1 :)
WinEunuuchs2Unix 1

@ WinEunuuchs2Unix 사과-mcp / mmv는 두뇌 방앗간이었습니다. 실제로 mcpmmv -c
steeldriver

걱정하지 마십시오. 내가 한 오타마다 달러가 있다면 나는 백만장자가 될 것입니다 :) 나는 printf명령을 명확히하고 싶습니다 . 매개 변수 1로 전달 printf '%s\0' "$1"*되면 작동 한다고 말하고 gmail-meta3있습니까?
WinEunuuchs2Unix 2018 년

@ WinEunuuchs2Unix 아마도 호출 컨텍스트가 globbing cps gmail-meta3*을하도록 한 다음 printf '%s\0"$ @" 를 쓸 것입니다. | 함수에서 ...`. 또는 단순히 for f; do cp -- "$f" "$f.bak"; done( xiota의 답변 과 같지만 기능으로) 사용하십시오
steeldriver

1
zmv"와일드 카드 교체"모드를 사용할 수 있다는 점에 유의하십시오 .zmv -W -C 'gmail-meta3*' '*.bak'
0x5453

5

rsync 전용 솔루션

파일을 백업하려는 경우 새 디렉토리로 파일을 복사 할 수 있습니다

rsync /path/to/dir/Filename* /path/to/backupdirectory

Filename파일이에서 (으) /path/to/dir/로 복사 됩니다 /path/to/backupdirectory.


rsync + 파일 이름 변경

백업 파일에 접미사를 붙이려면 문제가 생길 수 있습니다 rsync...

rsync -Iu /path/to/dir/Filename* /path/to/dir/Filename* -b --backup-dir=/path/to/backupdirectory --suffix=.bak

이렇게하면 기존 파일 ( -I)을 기존 파일 ( )로 덮어 쓰지만 -u새 파일 이 아닌 ( ) 최신 파일이 아닌 경우에만 접미사를 사용하여 백업을 만듭니다.

같은 디렉토리에서 그렇게 할 수도 있습니다. 그러나 기존 백업은 제외하는 것이 좋습니다.

rsync -Iu /path/to/dir/Filename* /path/to/dir/Filename* -b --backup-dir=/path/to/backupdirectory --suffix=.bak --exclude '*.bak'


나는 rsycnc내가 upvoted하는 것을 좋아 하지만, 더 간단한 방법은 cp Filename* /path/to/backup/dir파일이 *.bak별도의 디렉토리에있는 경우 uniquifier가 필요하지 않기 때문 입니다.
WinEunuuchs2Unix

4

요청한대로해야합니다.

cps(){ p="${@: -1}"; for f in "${@:1:$#-1}"; do cp -ai "$f" "${p//\?/$f}"; done  }

용법:

cps FILES... pattern
Example 1: cps gmail-meta3* ?.bak
Example 2: cps * save-?
Example 3: cps * bla-?-blubb

패턴의 첫 문자 일 때 인용해야 하기 ?때문에 선택했습니다 #. 그렇지 않으면 주석의 시작으로 인식됩니다.

테스트:

$ touch 'test};{bla#?"blubb'
$ cps test* bla-?-blubb
$ ls
test};{bla#?"blubb  bla-test};{bla#?"blubb-blubb


접미사 추가를위한 일부 이전 버전의 스크립트 :

@ WinEunuuchs2Unix 답변과 비슷하지만 더 유연하고 파싱하지 않는다고ls 생각합니다 .

cps(){ S="$1"; shift; printf '%s\0' "$@" | xargs -0 -I{} cp -abfS "$S" {} {}; }

이것을 당신의에 넣으십시오 .bashrc.

용법:

cps SUFFIX FILES...
Example: cps .bak gmail-meta3*

대안은 접미사를 마지막 인수로 사용합니다 ( viavia ).

cps(){ S="${@: -1}"; printf '%s\0' "${@:1:$#-1}" | xargs -0 -I{} cp -abfS "$S" {} {}; }

용법:

cps FILES... SUFFIX
Example: cps gmail-meta3* .bak


좋은 코딩하지만 사용의 수십 년 후 어떤 하드의의 소스를 다음 대상 에 스위치를 복사 명령에 대상 다음 소스
WinEunuuchs2Unix

뒤에 접미사가있는 기능을 추가했습니다.
pLumo

더 직관적 인 감사합니다. 그것을 접미사라고 부르는 것은 내 대답이 그것을 코딩 한 방식과 일치하지만 실제로는 대상 또는 대상입니다. 다른 사용자는 다음을 사용할 수 있습니다 copy gmail-meta3* old-meta3*.. 내 대답에 나는 *내 질문 요청처럼 목적지 이름 을 얻는 방법을 알 수 없습니다 ...
WinEunuuchs2Unix

문제는 *쉘에 의해 해석되므로 함수는 알지 못합니다. 다른 문자가 필요하거나 인용 한 다음 함수 내에서 원래 파일 이름으로 바꾸십시오.
pLumo

#대한 대체 와일드 카드로 사용할 수 *있을까요? 그래서 당신은 입력 할 수 copy filenames# save-#있습니다. 와일드 카드 문자가 소스 및 대상에서 동일하기를 원한다고 생각합니다.
WinEunuuchs2Unix

4

나는이 라이너를 내 안에 썼다 ~/.bashrc. find내가 사용한다고 가정 하면 훨씬 더 나은 답변을 게시 할 수 있습니다. 더 나은 답변은 C로 작성 될 수 있습니다.이 Q & A가 더 나은 답변을 위해 공을 굴리기를 바랍니다.

cps () {
    # cps "Copy Splat", copy group of files to backup, ie "cps Filename .bak"
    # Copies Filename1 to Filename1.bak, Filename2 to Filename2.bak, etc.
    # If Filename1.bak exists, don't copy it to Filename1.bak.bak
    for f in "$1"*; do [[ ! "$f" == *"$2" ]] && cp -a "$f" "$f$2"; done

    # OLD version comments suggested to remove 
    # ls "$1"* | while read varname; do cp -a "$varname" "$varname$2"; done
}
  • for f in "$1"*; do: $1gmail-meta3매개 변수이며 f일치하는 파일 목록입니다. gmail-meta3, gmail-meta3-LAB-9999 등에 대해 다음을 수행하십시오.
  • [[ ! "$f" == *"$2" ]] &&: 위와 $f동일합니다 f. 전달 $2.bak매개 변수입니다. 이것을 결합하면 파일 이름이 끝나지 않는 경우 .bak(복사 .bak하고 싶지 않기 때문에 .bak.bak) 다음을 수행하십시오.
  • cp -a "$f" "$f$2"; gmail-meta3을 gmail-meta3.bak 등에 복사하십시오.
  • done: 루프백하고 gmail-meta3*리스트 에서 다음 파일 이름을 가져옵니다 .

cps gmail-meta3 .bak 샘플 출력

여기에서 질문을 예로 사용하면 실제로 어떻게 보이는지입니다.

───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ ll gmail-meta3*
-rw-rw-r-- 1 rick rick 26467821 May 20 16:43 gmail-meta3
-rw-rw-r-- 1 rick rick 26467821 May 20 16:43 gmail-meta3.bak
-rw-rw-r-- 1 rick rick      643 May 20 16:43 gmail-meta3-LAB-1558392194-26467821
-rw-rw-r-- 1 rick rick      643 May 20 16:43 gmail-meta3-LAB-1558392194-26467821.bak
-rw-rw-r-- 1 rick rick    49607 May 20 16:44 gmail-meta3-REC-1558392194-26467821
-rw-rw-r-- 1 rick rick    49607 May 20 16:44 gmail-meta3-REC-1558392194-26467821.bak
-rw-rw-r-- 1 rick rick   728954 Jun 27 17:04 gmail-meta3-YAD-1558392194-26467821
-rw-rw-r-- 1 rick rick   728954 Jun 27 05:46 gmail-meta3-YAD-1558392194-26467821.bak
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ cps gmail-meta3 .bak
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ ll gmail-meta3*
-rw-rw-r-- 1 rick rick 26467821 May 20 16:43 gmail-meta3
-rw-rw-r-- 1 rick rick 26467821 May 20 16:43 gmail-meta3.bak
-rw-rw-r-- 1 rick rick      643 May 20 16:43 gmail-meta3-LAB-1558392194-26467821
-rw-rw-r-- 1 rick rick      643 May 20 16:43 gmail-meta3-LAB-1558392194-26467821.bak
-rw-rw-r-- 1 rick rick    49607 May 20 16:44 gmail-meta3-REC-1558392194-26467821
-rw-rw-r-- 1 rick rick    49607 May 20 16:44 gmail-meta3-REC-1558392194-26467821.bak
-rw-rw-r-- 1 rick rick   728954 Jun 27 17:04 gmail-meta3-YAD-1558392194-26467821
-rw-rw-r-- 1 rick rick   728954 Jun 27 17:04 gmail-meta3-YAD-1558392194-26467821.bak
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ 

참고 : 명령 -a과 함께 플래그를 사용하여 cp타임 스탬프를 유지하고 파일 백업을 더 잘 파악할 수 있습니다.

파일 사본의 원본과 날짜 및 시간이 정확히 동일한 지 확인하십시오. 는 IF -a매개 변수가 생략 된 그들은 현재 날짜와 시간을 부여 할 것이며, 파일 크기가 동일 할 것이라는 점을 제외하고는 진정한 백업처럼 보이지 않는 것입니다.


6
사람들은 항상 파싱을 권장하지 않습니다ls
qwr

3
언급 find했으므로 구문 분석의 위험을 알고 있다고 가정 ls합니까? 그러나 귀하의 경우에 둘 필요가 없습니다 : 그냥 할 for file in "$1"*; do copy -a "$file" "$file$2"; done-이 완전히 안전하고 어떤을 통해 간접의 종류보다 훨씬 간단 ls또는 findwhile루프.
Konrad Rudolph

@KonradRudolph 제안 해 주셔서 감사합니다. 몇 가지 사소한 변경으로 제안을 구현하고 테스트했습니다.
WinEunuuchs2Unix 2016 년

2

요구 사항을 달성하는 또 다른 방법은 파일을 임시 디렉터리에 복사하고 rename명령을 사용하여 이름을 바꾸는 것입니다.

$ mkdir backup
$ cp filename* /tmp/rename-backup/
$ rename 's/(filename.*)/$1.bak/' /tmp/rename-backup/*
$ mv /tmp/rename-backup/* ./

스크립트로 필요하면 다음과 같이 사용할 수 있습니다

cps () {
    mkdir -p /tmp/rename-backup/
    cp "$1"* /tmp/rename-backup/
    rename "s/($1.*)/\$1.$2/" /tmp/rename-backup/*
    mv "/tmp/rename-backup/$1"*".$2" .
}

그리고 당신은 그렇게 사용할 수 있습니다 :

cps file bak

이것은 예입니다

$ ls -l
total 0
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file a
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file ab
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file ac
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename1
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename2
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename3
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename4
$ cps file bak
$ ls -l
total 0
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file a
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 file a.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file ab
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 file ab.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file ac
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 file ac.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename1
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 filename1.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename2
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 filename2.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename3
-rw-r--r--  1 danny  wheel  0 Jun 26 16:41 filename3.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename4
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 filename4.bak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.