若要删除运行在远程Linux框上的dir中的所有最新文件(除2个文件外),我使用:
cd /data
ls -1tr | head -n -2 | xargs -d '\n' rm -f --在登录到远程Linux框后,我手动执行这些命令,但我试图将这些命令的登录和运行合并到一个命令中。
我使用scp执行类似的操作,在dir /local/data上登录文件并将文件scp到本地机器:
scp -i LightsailDefaultKey-eu-west-2.pem -r ubuntu@xxx.xxx.xxx.xxx:/data/ /local/data是否有一种方法可以执行与上面的登录和命令类似的操作:
cd /data
ls -1tr | head -n -2 | xargs -d '\n' rm -f --在本地机器上的远程计算机上执行单个命令吗?
发布于 2019-09-29 05:29:48
与其他招贴画一样,您不应该使用ls进行这种解析,但是既然您所拥有的内容适合您正在做的工作,那么您就不能使用ls命令中的-d开关来获得完整的目录路径吗?
除非您正在做更多的工作,否则没有理由更改您的工作目录。注意,您需要添加该通配符。
ssh user@host "ls -d1tr /data/* | head -n -2 | xargs -d '\n' rm -f --"发布于 2019-09-20 02:59:20
find而不是ls。见为什么not解析ls(取而代之的是做什么)?。例如,使用find、sort、head和cut的GNU版本:
ssh -i LightsailDefaultKey-eu-west-2.pem ubuntu@xxx.xxx.xxx.xxx \
'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 ubuntu@xxx.xxx.xxx.xxx <<-'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发布于 2019-09-19 16:46:11
不能将scp命令和shell命令合并在同一个执行中。你能做的最好就是:
scp -i LightsailDefaultKey-eu-west-2.pem -r ubuntu@xxx.xxx.xxx.xxx:/data/ /local/data && \
ssh -i LightsailDefaultKey-eu-west-2.pem -r ubuntu@xxx.xxx.xxx.xxx:/data/ /local/data bash -c "cd /data; ls -1tr | head -n -2 | xargs -d '\n' rm -f --"注意,我使用&&确保ssh不运行,除非scp成功-否则,您将删除尚未同步的文件。
https://unix.stackexchange.com/questions/542646
复制相似问题