쉘 스크립트를 사용하여 파일 이름 표현을 기반으로 파일을 이동하는 방법은 무엇입니까?

쉘 스크립트를 사용하여 파일 이름 표현을 기반으로 파일을 이동하는 방법은 무엇입니까?

쉘 스크립트를 사용하여 다음을 달성하고 싶습니다. 파일을 인수로 사용하여 스크립트를 호출하면 파일 이름의 일부를 기준으로 파일을 이동해야 합니다.

예를 들어, "자동차 보험 견적_zz21.pdf"는 21로 정렬됩니다. 자동차 보험(FilingCab의 하위 폴더) "2012-09-01 주택 보험 견적_zz20.pdf"는 20으로 정렬됩니다. 주택 보험(FilingCab의 하위 폴더) 파일실 )

논리적으로는 이렇게 읽어야 한다고 생각합니다. 오래전부터 프로그래밍을 해서 알고리즘은 있는 줄 알았는데 명령이나 구문은 없었습니다.

도움을 주신 모든 분들께 진심으로 감사드립니다!


FileToMove = $1
FolderNo = (The number after zz and before a .)
ParentFolder = (~/FilingCab)
FolderList = (List of all folders in ParentFolder) 
TargetFolder = (Folder among FolderList that begins with FolderNo) - use grep?

if TargetFolder <> not empty
         cd ParentFolder
         mv FileToMove to TargetFolder
end with success
else
         do nothing
endif

end script

답변1

다음과 같이 시도해 보세요.

#! /bin/bash

# Config variable(s)
ParentFolder="~/FilingCab"

# arg processing (minimalist :)
FileToMove="$1"

# use sed to extract folder number from filename.
FolderNo=$(echo "$FileToMove" | sed -r -e 's/.*zz([0-9]+)\.pdf/\1/')

# use find to search for subdirectories of parent folder that begin
# with the folder no followed by a '.'
TargetFolder=$(find "$ParentFolder" -maxdepth 1 -type -a -d -name "${FolderNo}.*")

NumFolders=$(echo "$TargetFolder" | wc -l)

if [ "$NumFolders" -eq 1 ] ; then 
 mv "$ParentFolder/$FileToMove" "$TargetFolder/" 
else
  echo "Error: $NumFolders beginning with "$FolderNo." found" >&2
  exit 1
fi

모든 변수 이름 주위에는 큰따옴표가 있습니다. 이는 항상 안전하고 올바른 작업이지만 귀하의 경우에는 예제로 제공한 파일 이름과 디렉터리 이름에 공백 문자가 포함되어 있으므로 필수적입니다.

-maxdepth 1이 명령은 find$ParentFolder의 직접 하위 디렉터리만 검색합니다(즉, 하위 디렉터리의 하위 디렉터리는 무시됩니다). 그게 의도한 내용이 아니라면 해당 부분을 삭제하시면 됩니다. find$FolderNo로 시작하는 하위 디렉터리에 대해 $ParentFolder를 검색합니다 .

"TargetFolder가 null이 아닌 경우"라는 말이 무슨 뜻인지 잘 모르겠습니다. "문자열 $TargetFolder가 null이 아닙니다"를 의미한다고 가정합니다. 일반적으로 $TargetFolder가 존재하고 디렉터리인지 확인하지만 a에서 디렉터리 이름을 가져오므로 find -type d비어 있거나 디렉터리일 수만 있습니다. 또는 "$FolderNo"로 시작하는 항목이 여러 개인 경우 더 많을 수도 있습니다.

조회에서 정확히 하나의 결과가 나오는지 확인하는 것이 더 낫다고 생각합니다. 다른 값은 오류이므로 파일을 이동할 수 없습니다. 0은 일치하는 폴더를 찾을 수 없음을 의미합니다. 2개 이상은 "$FolderNo"로 시작하는 여러 폴더를 의미합니다. 설립하다.

stderr로 전송되는 경고 메시지는 선택 사항입니다. 같은 일 exit 1이지만 권장됩니다. 이를 통해 다른 스크립트에서 이 스크립트를 호출하고 성공했는지 확인할 수 있습니다.

관련 정보