다음과 같은 텍스트 파일이 있습니다.
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