Den Vakxden
Den Vakxden

Reputation: 53

bash create many directories if it doesn't exist over ssh

I want to create on a remote server2 many directories that already exist on the server1. My script on the server1:

LOG_DIR="/opt/server1/service/logs/"
DEST_HOST="server2"
DEST_USER="logger"
DEST_DIR="/volumes/storage/server1"

LISTEN_DIR=$(find $LOG_DIR -type d | tr '\n' ' ')

ssh $DEST_USER@$DEST_HOST " for Y in $LISTEN_DIR
                do
                    if [ ! -d  $DEST_DIR$Y ]; then
                        mkdir -p $DEST_DIR$Y;
                    fi
                done"

But on the server1 in directory /opt/server1/service/logs/ there are several other directories... Results of script:

[20:00 root@server1:~]# bash -x script.sh
+ LOG_DIR=/opt/server1/service/logs/
+ DEST_HOST=server2
+ DEST_USER=logger
+ DEST_DIR=/volumes/storage/server1
++ find /opt/server1/service/logs/ -type d
++ tr '\n' ' '
+ LISTEN_DIR='/opt/server1/service/logs/ /opt/server1/service/logs/org.service-com.settlement.host.ui-1.0.0.SNAPSHOT /opt/server1/service/logs/com.springsource.server.repository.hosted-2.0.0.RELEASE /opt/server1/service/logs/org.service-com.xml2titp.ws-1.0.0.SNAPSHOT /opt/server1/service/logs/org.service-com.mportal.ws.oracle-1.0.0.SNAPSHOT /opt/server1/service/logs/access /opt/server1/service/logs/com.springsource.server.admin.web-2.0.0.RELEASE /opt/server1/service/logs/org.flex.web.plan-2 /opt/server1/service/logs/org.service-com.admin.host-1.0.0.SNAPSHOT /opt/server1/service/logs/org.service-com.tickets.ws-1.0.0.SNAPSHOT /opt/server1/service/logs/org.service-com.apijson.ws-1.0.0.SNAPSHOT /opt/server1/service/logs/apool_xyz.plan-2 /opt/server1/service/logs/org.service-com.json2titp.host.ui-1.0.0.SNAPSHOT /opt/server1/service/logs/server1 /opt/server1/service/logs/org.service-com.apijson.host.ui-1.0.0.SNAPSHOT /opt/server1/service/logs/org.flex.web.plan-2-org.service-com.flex.bundle.main-1.0.0.SNAPSHOT /opt/server1/service/logs/org.service-com.xyzsettlement.ws-1.0.0.SNAPSHOT /opt/server1/service/logs/org.service-com.host-1.0.0.SNAPSHOT /opt/server1/service/logs/wrapper '
+ ssh logger@server2 'IFS_OLD=  

                for Y in /opt/server1/service/logs/ /opt/server1/service/logs/org.service-com.settlement.host.ui-1.0.0.SNAPSHOT /opt/server1/service/logs/com.springsource.server.repository.hosted-2.0.0.RELEASE /opt/server1/service/logs/org.service-com.xml2titp.ws-1.0.0.SNAPSHOT /opt/server1/service/logs/org.service-com.mportal.ws.oracle-1.0.0.SNAPSHOT /opt/server1/service/logs/access /opt/server1/service/logs/com.springsource.server.admin.web-2.0.0.RELEASE /opt/server1/service/logs/org.flex.web.plan-2 /opt/server1/service/logs/org.service-com.admin.host-1.0.0.SNAPSHOT /opt/server1/service/logs/org.service-com.tickets.ws-1.0.0.SNAPSHOT /opt/server1/service/logs/org.service-com.apijson.ws-1.0.0.SNAPSHOT /opt/server1/service/logs/apool_xyz.plan-2 /opt/server1/service/logs/org.service-com.json2titp.host.ui-1.0.0.SNAPSHOT /opt/server1/service/logs/server1 /opt/server1/service/logs/org.service-com.apijson.host.ui-1.0.0.SNAPSHOT /opt/server1/service/logs/org.flex.web.plan-2-org.service-com.flex.bundle.main-1.0.0.SNAPSHOT /opt/server1/service/logs/org.service-com.xyzsettlement.ws-1.0.0.SNAPSHOT /opt/server1/service/logs/org.service-com.host-1.0.0.SNAPSHOT /opt/server1/service/logs/wrapper  
                do
                    if [ ! -d  /volumes/storage/server1 ]
                    then
                        mkdir -p /volumes/storage/server1;
                    fi;
                done;'

Upvotes: 1

Views: 213

Answers (1)

Gilles Quénot
Gilles Quénot

Reputation: 185053

Try doing this :

find local_dir -type d -print0 |
ssh remote 'while IFS="" read -r -d "" a; do mkdir -p "remote_dir/$a"; done'

Or if you prefer a one-liner :

find local_dir -type d -print0 | ssh remote 'while IFS="" read -r -d "" a; do mkdir -p "remote_dir/$a"; done'

EXPLANATIONS

  • find local_dir -type d : print all dirs from local_dir so STDOUT
  • | : Unix pipe : branch STDOUT of the latest command to STDIN of the next one
  • ssh remote 'remote_command' : ssh to a remote server, and execute a command. Single ' quotes are required to prevent the shell to interpolate $a variable
  • while read a; do mkdir -p remote_dir/$a; done : the remote command, it reads on STDIN
  • with mkdir -p, no need to check existence of any dir

Upvotes: 3

Related Questions