일치 항목에 따라 폴더를 다른 폴더로 이동

일치 항목에 따라 폴더를 다른 폴더로 이동

다음과 같은 텍스트 파일이 있습니다.

    Order,Site_ID
[email protected],AR-Slu

"주문" 열에는 "Site_ID" 열(텍스트 파일의 동일한 행)에 표시된 해당 폴더로 이동하려는 폴더의 이름이 포함되어 있습니다. 다음은 하나의 폴더만 이동하는 예입니다. 이 예에서는 폴더를 이동하고 싶습니다.'[이메일 보호됨]'를 'AR-Slu' 폴더로 복사합니다. 테이블에 포함된 정보는 폴더 이름이지만 폴더에 대한 경로 정보는 없습니다. 그러나 두 폴더는 모두 동일한 상위 폴더에 있습니다. 이 작업을 수행하는 방법을 아는 사람이 있나요?

답변1

공백으로 구분된 값의 경우

(질문의 원래 버전과 같습니다)

(cd /parent/folder && tail -n +2 | xargs -L 1 mv --) < file

tail제목을 건너뛰는 것 입니다.

를 사용하면 -L 1입력 1줄마다 xargs하나의 명령이 실행됩니다.mv성격이 줄은 에 매개변수로 전달됩니다 mv.

을 위한 xargs,성격모두 공백으로 구분되지만(모든 공백 또는 공백과 탭만 구현에 따라 다름 xargs) , 및 이러한 공백 또는 서로를 이스케이프하는 데 사용할 수 있는 인용 연산자로 xargs도 인식됩니다 ".'\

while read쉘 루프를 사용할 수도 있습니다 .

(
  cd /parent/folder || exit
  unset -v IFS
  read skip_header <&3
  ret=0
  while read src dst rest_ignored <&3; do
    mv -- "$src" "$dst" || ret=$?
  done
  exit "$ret"
) 3< file

마찬가지로 read기본값 $IFS(또는 이후 unset IFS)의 경우 단어는 공백이나 탭으로 구분됩니다. \이 줄 자체를 이스케이프하거나 다음 실제 줄에서 줄을 계속하는 데 사용할 수 있습니다.

CSV 파일의 경우

파일이 CSV 파일(따옴표로 구분되고 ,따옴표로 묶인 값)인 경우 ksh93셸에서 루프를 실행하고 CSV 구문 분석을 위해 내장 옵션을 -S사용할 수 있습니다.read

#! /bin/ksh93 -
(
  cd /parent/folder || exit
  IFS=,
  read -S skip_header <&3
  ret=0
  while read -S src dst rest_ignored <&3; do
    mv -- "$src" "$dst" || ret=$?
  done
  exit "$ret"
) 3< file

파일에 CSV 참조가 사용되지 않는 한 -S다른 POSIX 셸에서도 작동하도록 이 옵션을 선택 취소할 수 있습니다 .bash

perl또는 CSV 구문 분석 모듈 이나 다른 스크립트 언어를 사용할 수 있습니다 .

(cd /parent/folder && perl -C -MText::CSV -e '
  $c = Text::CSV->new;
  $ret = 0;
  $c->getline(STDIN); # skip header
  while (($src, $dst) = @{$c->getline(STDIN)}) {
    system "mv", "--", $src, $dst;
    $ret = 1 if $?;
  }
  exit $ret;') < file

관련 정보