rsyncing到NFS-Share时路径中不需要的名称

时间:2016-01-14 18:05:28

标签: bash rsync

我正在使用NAS来备份我的文件服务器。 NAS通过NFS导出/share/Backup,NFS作为/mount/qnap安装在文件服务器上。我想跟踪哪些文件是rsynced但排除包含许多小文件的Backup-Dir。因此我运行了两个rsync实例,一个-v实例,另一个实例没有rsync --delete -av --exclude Backup /mnt/btrfs-raid/ /mnt/qnap/ 。以下命令可以正常工作,执行后,/ mount / qnap上的目录结构与/ mount / btrfs-raid相同。

rsync --delete -av /mnt/btrfs-raid/Backup /mnt/qnap/Backup

使用命令

更新Backup文件夹
/mnt/qnap/Backup/Backup/..Subdirectories

在NAS上生成以下目录结构:

rsync --delete -av /mnt/btrfs-raid/Backup /mnt/qnap/

要获得我希望的结果,我必须从目标目录路径中删除最后一个“备份”:

class VideoStreamServer {

    public void startServer() {
        outFilePath = getActivity().getExternalFilesDir("/") + "/pdf.pdf";
        outFile = new File(outFilePath);
        Runnable videoStreamTask = new Runnable() {
            @Override
            public void run() {
                try {
                    ServerSocket socket = new ServerSocket(port);


                    System.out.println("Waiting for client to connect.");
                    while (true) {
                        Socket client = socket.accept();

                        BufferedOutputStream os = new BufferedOutputStream(client.getOutputStream());
                        FileInputStream in = new FileInputStream(outFile);
                        BufferedInputStream inFromClient = new BufferedInputStream(client.getInputStream());

                        StringBuilder sb = new StringBuilder();
                        sb.append("HTTP/1.1 200 OK\r\n");
                        sb.append("Accept-Ranges: bytes\r\n");
                        sb.append("Connection: close\r\n");
                        sb.append("Content-Length: " + in.available() + "\r\n");
                        sb.append("Content-Disposition: attachment; filename=file.pdf\r\n");
                        sb.append("Content-Type: application/pdf \r\n");
                        sb.append("\r\n");


                        byte[] data = new byte[1024];
                        int length;
                        //inFromClient.read(data);
                        //System.out.println("request from client"+getStreamData(inFromClient));
                        System.out.println("Thread Started");
                        //System.setProperty("http.keepAlive", "false");
                        os.write(sb.toString().getBytes());
                        while ((length = in.read(data)) != -1) {
                            os.write(data, 0, length);
                        }
                        os.close();
                        client.close();
                        socket.close();
                        in.close();
                        break;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        };

        Thread streamServer = new Thread(videoStreamTask);
        streamServer.start();
    }

}

为什么第二个例子不像第一个例子那样有效? 谢谢 斯蒂芬

1 个答案:

答案 0 :(得分:0)

路径中的尾部斜杠对rsync很重要。请参阅the documentation

rsync -avz foo:src/bar /data/tmp
     

这将递归地将计算机foo上目录src / bar中的所有文件传输到本地计算机上的/ data / tmp / bar目录中。文件以“存档”模式传输,这可确保传输中保留符号链接,设备,属性,权限,所有权等。此外,压缩将用于减少传输的数据部分的大小。

rsync -avz foo:src/bar/ /data/tmp
     

源上的尾部斜杠会更改此行为,以避免在目标位置创建其他目录级别。您可以将源尾部/尾部视为“复制此目录的内容”,而不是“按名称复制目录”,但在这两种情况下,包含目录的属性都将传输到目标上的包含目录。换句话说,以下每个命令都以相同的方式复制文件,包括它们对/ dest / foo属性的设置: