우선, 저는 가장 뛰어난 스크립터가 아닙니다. 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
cd
i) 필요하지 않고 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" \;