Linux 删除除文件+;跨多个服务器链接的文件(NET::SSH::MULTI)

Linux 删除除文件+;跨多个服务器链接的文件(NET::SSH::MULTI),linux,unix,ssh,net-ssh,Linux,Unix,Ssh,Net Ssh,我有几千张图片保存为需要删除的日志 为了避免rm的限制并跨多个服务器执行此操作,我使用了以下代码 Net::SSH::Multi.start(:on_error => :ignore) do |session| # define servers in groups for more granular access session.group :app do session.use 'example@example', :password=> 'exam

我有几千张图片保存为需要删除的日志

为了避免rm的限制并跨多个服务器执行此操作,我使用了以下代码

 Net::SSH::Multi.start(:on_error => :ignore) do |session|

    # define servers in groups for more granular access
    session.group :app do
      session.use 'example@example', :password=> 'example'
    end

# execute commands on a subset of servers
 session.with(:app).exec "find /tmp/motion -maxdepth 1 -not -name 'lastsnap.jpg' -print0 | sudo xargs -0 rm"
end
ls-l lastsnap.jpg显示lastsnap.jpg链接到另一个文件,如下所示

6月30日08:18 lastsnap.jpg->81-20140603081840-snap.jpg

由于我上面提到的日志记录场景,另一个文件会不断更改

重申这个问题,如何删除不是lastsnap.jpg的所有其他日志文件及其链接文件

谢谢你的帮助:)

根据评论进行编辑

cd /tmp/motion; rm -rvf $(ls -1 | grep -v -E "$(basename `find . -lname lastsnap.jpg`)|lastsnap.jpg")

注意:确保文件名中没有空格。另一方面,此方法将不起作用,需要修改以适应文件名中的空格。

我使用find命令编写了一个逻辑。检查它是否对你有用。 我的目录包含以下文件

pyramid-stone.jpg
tallest_water_slide.jpg
SAOLA.JPG
testnap.jpg
silicon_valley_talent.jpg
The_Organic_Battery_From_Japan.jpg
其中testnap.jpg是一个链接

testnap.jpg->pyramid-stone.jpg

因此,我编写了一个小的awk脚本来获取链接名称及其指向的位置

IG1=`ls -l | grep ^l | awk '{printf $(NF-2);}'`
IG2=`ls -l | grep ^l | awk '{printf $(NF);}'`
然后我使用find命令打印所有jpg,而不是链接

find . -type f \( -iname "*.jpg" ! -iname $IG1 ! -iname $IG2 \)
OP是


注意:您必须在find命令之后添加rm以删除文件

是否有办法在一行中完成此操作?我忘了提到我必须跨多个服务器执行此操作,我使用的是NET::SSH::MULTI,我将为this@Kishe看到编辑了吗?我刚刚通过我的老板运行了这段代码,他告诉我不要使用-rvf,以防我们需要将其他内容列入白名单。我们是否可以这样做,即它只显式删除我们正在查找的jpg,而不是相反?@Kishe这将显式删除我们正在查找的jpg。很抱歉,还有一个愚蠢的问题,但我认为您的编辑正在删除链接文件D:我将稍后测试,我对脚本+linux非常陌生,所以可能需要一段时间
find . -type f \( -iname "*.jpg" ! -iname $IG1 ! -iname $IG2 \)
./SAOLA.JPG
./silicon_valley_talent.jpg
./tallest_water_slide.jpg
./The_Organic_Battery_From_Japan.jpg