SSH를 통해 파일 목록 삭제

SSH를 통해 파일 목록 삭제

나는 다음을 수행하려고합니다 :

glob 패턴과 일치하는 원격 파일 목록을 검색합니다.

existing_files=$(ssh [email protected] "ls pattern*")

패턴과 일치하는 새 파일을 추가합니다.

scp pattern_matching_file [email protected]:

이제 새로 생성된 파일을 삭제하지 않고 그 안의 파일을 삭제하고 싶지만 $existing_file방법을 모르겠습니다.

답변1

당신은

scp pattern_matching_file [email protected]:

그런 다음 해당 디렉터리의 모든 파일을 삭제하고 싶습니다.와는 별개로방금 전송한 항목에 대한 것입니다. 다음은 두 가지 제안 사항입니다.

  1. 복사하기 전에 모든 파일을 삭제하세요.

    ssh -qn [email protected] 'find -maxdepth 1 -type f -name '*pattern*' -delete'
    
  2. 방금 복사한 파일을 제외한 파일을 삭제하세요.

    ssh -qn [email protected] 'find -maxdepth 1 -type f \( -name 'keep_this_file' -o -name '*pattern*' -delete \)'
    

-name '*pattern*'두 경우 모두 실제 대상 경로에 따라 지정된 디렉터리(도트 파일 포함)의 모든 내용을 삭제하는 것을 생략할 수 있습니다 . 이 명령 은 find단순화된 쉘 글로브 모드에 있으므로 제공한 원래 명령을 사용해야 합니다 .-namepatternls

그것을 적용하기 전에 이론을 테스트하는 -delete것으로 대체하십시오 .-print


특정 패턴과 일치하는 파일 목록을 검색하려면 를 사용할 수 있지만 ls {pattern}이 방법도 일치하는 디렉터리로 드롭다운됩니다. 이 -d플래그를 사용하면 이를 방지할 수 있지만 파일 이름에 개행 문자가 포함되어 있으면 여전히 문제가 발생합니다 \n. 특히 나중에 파일을 삭제하기 위해 목록을 사용하려는 경우.

대안으로 다음과 같은 파일 배열을 만들 수 있습니다.

files=()
while IFS= read -r -d '' file
do
    files+=("$file")
done < <( ssh -qn [email protected] find -maxdepth 1 -name '*pattern*' -print0 )

# Show what we caught
for file in "${files[@]}"; do echo ">$file<"; done

관련 정보