원격 Linux 시스템에서 실행 중인 디렉터리에서 최신 파일 2개를 제외한 모든 파일을 삭제하려면 다음을 사용합니다.
cd /data
ls -1tr | head -n -2 | xargs -d '\n' rm -f --
원격 Linux 시스템에 로그인한 후 이러한 명령을 수동으로 실행하지만 로그인과 이러한 명령 실행을 하나의 명령으로 결합하려고 합니다.
로그인 위치를 사용하여 비슷한 작업을 수행 scp
하고 파일을 로컬 컴퓨터의 dir에 scp했습니다 /local/data
.
scp -i LightsailDefaultKey-eu-west-2.pem -r [email protected]:/data/ /local/data
위의 로그인 및 명령과 유사한 작업을 수행할 수 있는 방법이 있습니까?
cd /data
ls -1tr | head -n -2 | xargs -d '\n' rm -f --
로컬 컴퓨터의 원격 컴퓨터에서 단일 명령을 실행하시겠습니까?
답변1
다른 포스터에 동의합니다. 이런 종류의 구문 분석을 사용해서는 안 되지만 현재 수행 중인 작업에 작동하므로 명령에서 -d 스위치를 사용하여 전체 디렉토리 경로를 얻을 수 ls
는 없습니까 ?ls
더 많은 작업을 수행하지 않는 이상 작업 디렉토리를 변경할 이유가 없습니다. 이 와일드카드를 추가해야 합니다.
ssh user@host "ls -d1tr /data/* | head -n -2 | xargs -d '\n' rm -f --"
답변2
.see
find
대신 사용ls
왜아니요구문 분석ls
(및 수행 방법)?.원격 시스템에서 실행하려는 명령을 따옴표로 묶거나(단, 따옴표를 중첩하면 어려움이 있을 수 있음에 유의) 여기 문서에 넣으십시오.
find
예를 들어 , sort
, head
및 다음의 GNU 버전을 사용하십시오 cut
.
ssh -i LightsailDefaultKey-eu-west-2.pem [email protected] \
'find /data/ -maxdepth 1 -type f -printf "%Ts\t%p\0" | sort -z -nr |
head -z -n 2 | cut -z -f2 | xargs -0r rm -f --'
printf 형식 문자열 주위에는 작은따옴표가 아닌 큰따옴표를 사용했습니다. 이는 작은따옴표로 묶여 실행되는 전체 명령 파이프라인을 래핑하기 때문입니다 ssh
. 를 사용할 수도 있지만 -printf '\''%Cs\t%p\0'\''
(변수 보간 등의 위험이 없으므로) 큰따옴표를 사용하는 것이 더 쉽습니다.
이 -printf
형식은 파일의 마지막 수정 타임스탬프(에포크 이후 초, 숫자로 쉽게 정렬 가능 sort -z -rn
), 탭 문자 및 파일의 전체 경로 이름을 인쇄합니다. 타임스탬프와 탭을 제거 cut
하고 파일 이름만 xargs
.
또 다른 옵션은 다음을 사용하는 것입니다.트레독:
ssh -i LightsailDefaultKey-eu-west-2.pem [email protected] <<-'EOF'
find /data/ -maxdepth 1 -type f -printf '%Ts\t%p\0' | sort -z -nr |
head -z -n 2 | cut -z -f2 | xargs -0r rm -f --
EOF
답변3
내가 아는 한, scp
동일한 실행에서 명령과 쉘 명령을 결합할 수 없습니다. 당신이 할 수 있는 가장 좋은 일은:
scp -i LightsailDefaultKey-eu-west-2.pem -r [email protected]:/data/ /local/data && \
ssh -i LightsailDefaultKey-eu-west-2.pem -r [email protected]:/data/ /local/data bash -c "cd /data; ls -1tr | head -n -2 | xargs -d '\n' rm -f --"
저는 scp가 성공하지 않으면 ssh가 실행되지 않도록 보장했습니다 &&
. 그렇지 않으면 아직 동기화되지 않은 파일이 삭제됩니다.