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

Does the command work when you first print it out and then run it manually in the shell?

I guess the problem results from me using both, single quotes and quotemeta when constructing the command line.

Maybe you can make sure that no filename contains a backslash or a single quote. Then you can eliminate both calls to quotemeta and replace them by $_ directly.

Note that your problem has nothing to do with Perl anymore and is only a matter of constructing the correct shell statement now.

Replies are listed 'Best First'.
Re^4: Rename all files on remote server to *.bak recursively
by nancylt723 (Initiate) on Jun 09, 2014 at 12:35 UTC
    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.
      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'