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

Thanks for the suggestion; however my files were not renamed: My code is now:

#!/usr/bin/perl my $h="testapp01"; my $dirname="/home/wasbatsrv/tmp/testbak"; my $uid="wasbatsrv"; my @remote_files= qx(ssh $uid\@$h 'find $dirname'); # Munge filenames to commands: my @commands= map { sprintf "mv -i '%s' '%s.bak'", quotemeta($_), quo +temeta($_) } @remote_files; # Send list of commands to the remote side: # First, a dry-run instead of actually doing that: my $remote= \*STDOUT; # Use this to actually do the remote execution: open $remote, "| ssh -q $uid\@$h"; print { $remote } join "\n", @commands;

But the files are not renamed and this is the output:

Pseudo-terminal will not be allocated because stdin is not a terminal +. mv: cannot stat `\\/home\\/wasbatsrv\\/tmp\\/testbak\\\n': No such fil +e or directory mv: cannot stat `\\/home\\/wasbatsrv\\/tmp\\/testbak\\/testbakr\\\n': +No such file or directory mv: cannot stat `\\/home\\/wasbatsrv\\/tmp\\/testbak\\/testbakr\\/thre +e\\.properties\\\n': No such file or directory mv: cannot stat `\\/home\\/wasbatsrv\\/tmp\\/testbak\\/testbakr\\/four +\\.properties\\\n': No such file or directory mv: cannot stat `\\/home\\/wasbatsrv\\/tmp\\/testbak\\/two\\.propertie +s\\\n': No such file or directory mv: cannot stat `\\/home\\/wasbatsrv\\/tmp\\/testbak\\/one\\.propertie +s\\\n': No such file or directory

Here is the directory listing:

[wasbatsrv@testapp01 testbak]$ ls one.properties testbakr two.properties

Replies are listed 'Best First'.
Re^3: Rename all files on remote server to *.bak recursively
by Corion (Patriarch) on Jun 06, 2014 at 12:46 UTC

    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.

      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.