나는 다음을 수행하려고합니다 :
glob 패턴과 일치하는 원격 파일 목록을 검색합니다.
existing_files=$(ssh [email protected] "ls pattern*")
패턴과 일치하는 새 파일을 추가합니다.
scp pattern_matching_file [email protected]:
이제 새로 생성된 파일을 삭제하지 않고 그 안의 파일을 삭제하고 싶지만 $existing_file
방법을 모르겠습니다.
답변1
당신은
scp pattern_matching_file [email protected]:
그런 다음 해당 디렉터리의 모든 파일을 삭제하고 싶습니다.와는 별개로방금 전송한 항목에 대한 것입니다. 다음은 두 가지 제안 사항입니다.
복사하기 전에 모든 파일을 삭제하세요.
ssh -qn [email protected] 'find -maxdepth 1 -type f -name '*pattern*' -delete'
방금 복사한 파일을 제외한 파일을 삭제하세요.
ssh -qn [email protected] 'find -maxdepth 1 -type f \( -name 'keep_this_file' -o -name '*pattern*' -delete \)'
-name '*pattern*'
두 경우 모두 실제 대상 경로에 따라 지정된 디렉터리(도트 파일 포함)의 모든 내용을 삭제하는 것을 생략할 수 있습니다 . 이 명령 은 find
단순화된 쉘 글로브 모드에 있으므로 제공한 원래 명령을 사용해야 합니다 .-name
pattern
ls
그것을 적용하기 전에 이론을 테스트하는 -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