in reply to Re^3: Rename all files on remote server to *.bak recursively
in thread Rename all files on remote server to *.bak recursively

I tried removing the quotmeta, but as far as I can tell, this would also try to rename the directories, also, which I do not want to do. I only want to rename the files.
  • Comment on Re^4: Rename all files on remote server to *.bak recursively

Replies are listed 'Best First'.
Re^5: Rename all files on remote server to *.bak recursively
by salva (Canon) on Jun 09, 2014 at 12:48 UTC
    Ask find to return only entries which are files:
    my @remote_files= qx(ssh $uid\@$h 'find $dirname -type f');
    Also, note that perl and your shell may have different quotation rules and so quotemeta may not always work.

      I did pick up on the -type f and fixed another problem, so my code now looks like this:

      #!/usr/bin/perl my $h="testapp01"; my $dirname="/home/wasbatsrv/tmp/testbak"; my $uid="wasbatsrv"; my @r_files= qx(ssh $uid\@$h 'find $dirname -type f'); my @remote_files; # Munge filenames to commands: my $x; # The following is necessary because the values in @r_files have # some kind of funky linefeed that chomp does not get rid of foreach my $f (@r_files) { $x = substr($f, 0, -1); push @remote_files, $x; } my @commands = map { sprintf "mv -f '%s' '%s.bak'", $_, $_ } @remote_ +files; print @commands, join "\n"; my $remote= \*STDOUT; # Use this to actually do the remote execution: open $remote, "| ssh -q -l $uid $h"; print { $remote } join "\n", @commands;

      This is the result I get and the script never returns:

      mv -f '/home/wasbatsrv/tmp/testbak/one.properties.bak' '/home/wasbatsrv/tmp/testbak/one.properties.bak.bak'mv -f '/home/wasbatsrv/tmp/testbak/testbakr/three.properties.bak' '/home/wasbatsrv/tmp/testbak/testbakr/three.properties.bak.bak'mv -f '/home/wasbatsrv/tmp/testbak/testbakr/four.properties.bak' '/home/wasbatsrv/tmp/testbak/testbakr/four.properties.bak.bak'mv -f '/home/wasbatsrv/tmp/testbak/two.properties.bak' '/home/wasbatsrv/tmp/testbak/two.properties.bak.bak'cc_admin@ivlpvlq bin$ Pseudo-terminal will not be allocated because stdin is not a terminal. ^C

      The following command does work when I run it alone: ssh -q -l wasbatsrv testapp01 mv -f '/home/wasbatsrv/tmp/testbak/one.properties' '/home/wasbatsrv/tmp/testbak/one.properties.bak'