KSH 스크립트에서 변수를 한 줄씩 읽는 데 문제가 있습니다.

KSH 스크립트에서 변수를 한 줄씩 읽는 데 문제가 있습니다.

우선, 저는 가장 뛰어난 스크립터가 아닙니다. 14일이 지난 인쇄 파일을 디렉터리에서 검색하여 보관 디렉터리로 이동하는 스크립트를 생성하라는 요청을 받았습니다. 여러 디렉터리에는 해당 아카이브 디렉터리가 있습니다. 이를 테스트하기 위해 소스 및 대상 디렉터리가 포함된 두 개의 텍스트 파일을 만들었습니다. 각 파일에 디렉터리 경로가 하나만 있을 때는 문제가 원활하게 진행되었습니다. 그러나 각 파일에 다른 디렉터리 경로를 추가하면 스크립트는 첫 번째 보관 폴더를 두 번째 보관 폴더로 이동합니다.

첫 번째 줄에 있는 파일은 printdirs.txt첫 번째 줄에 있는 경로로 이동되어야 합니다 archivedirs.txt. 그런 다음 루프가 다시 실행되고 경로의 두 번째 줄에 있는 파일이 printdirs.txt경로의 두 번째 줄에 있는 파일로 이동되어야 합니다 archivedirs.txt.

스크립트는 다음과 같습니다.

#!/usr/bin/ksh

printlist=/u/lawson/stage/Scripts/printdirs.txt
archivelist=/u/lawson/stage/Scripts/archivedirs.txt

# Checking the archive list and moving files

for i in $(cat $printlist) ; do
    cd $i   
    /usr/bin/find . -mtime +14 -type f -exec mv "{}" $(cat $archivelist) \;

done

텍스트 파일에 포함된 내용은 다음과 같습니다.

$ cat printdirs.txt
/u/lawson/law/print/lawson/tim/1
/u/lawson/law/print/dgfinance/monday190/1

$ cat archivedirs.txt
/u/lawson/law/print/archive
/u/lawson/law/print/archive2

"archive" 폴더를 "archive2" 폴더에 복사하지 않고 스크립트가 각 해당 줄을 반복하도록 하려면 어떻게 해야 합니까?

업데이트: terdon의 도움으로 스크립트가 업데이트되었습니다. echo 명령을 추가한 후의 출력은 다음과 같습니다.

# ./printarchive2.ksh 
/usr/bin/find /u/lawson/law/prin -mtime +14 -type f -exec mv /lawson/tim/1      /u/lawson/law/print/archive {} +
/usr/bin/find /u/lawson/law/prin -mtime +14 -type f -exec mv /dgfinance/monday190/1     /u/lawson/law/print/archive2 {} +

terdon이 사용하기를 원하는 스크립트는 디렉토리 경로에서 "t"를 제거하는 것입니다. "t"를 "n"으로 변경하여 테스트했습니다. 내 디렉토리 경로에서 문자 "n"을 제거했습니다. Korn 쉘이 읽을 수 있는 탭 필드 구분 기호를 나타내는 다른 방법이 있습니까? KSH에서는 작동하지 않는 것 같습니다.

답변1

여기에서 사용 하겠습니다 paste. 이것은 파일 결합을 위한 훌륭한 도구입니다:

$ paste printdirs.txt archivedirs.txt 
/u/lawson/law/print/lawson/tim/1    /u/lawson/law/print/archive
/u/lawson/law/print/dgfinance/monday190/1   /u/lawson/law/print/archive2

위에서 볼 수 있듯이 탭으로 구분되어 두 파일 모두에서 연속된 줄을 인쇄합니다. 디렉터리 이름에 공백이 포함될 수 있는 경우 탭 구분이 유용합니다. 이제 출력을 반복하여 paste작업을 수행할 수 있습니다.

#!/usr/bin/ksh

printlist="/u/lawson/stage/Scripts/printdirs.txt"
archivelist="/u/lawson/stage/Scripts/archivedirs.txt"

paste "$printlist" "$archivelist" | while IFS=$'\t' read source dest; do
    /usr/bin/find "$source" -mtime +14 -type f -exec mv -t "$dest" {}  +
done

cdi) 필요하지 않고 find어디서나 대상에서 실행할 수 있는 이를 제거했습니다 . ii) for i in $(cat foo)일반적으로 피해야 하는 구문을 제거하고 iii) 호출을 시도하고 결합하는 보다 효율적인 구문 -exec ... \;으로 대체했습니다. , 이것이 필요한 이유입니다).-exec +mv-t "$dest"

mv-t옵션을 지원하지 않으면 명령을 다시 변경 하세요 find.

/usr/bin/find "$source" -mtime +14 -type f -exec mv "$source" "$dest" \;

관련 정보