【问题标题】:cp: missing destination file operand aftercp: 之后缺少目标文件操作数
【发布时间】:2013-12-17 21:53:21
【问题描述】:

我正在尝试完全备份并将所有文件从一个目录复制到另一个目录

    #!/bin/bash 

    #getting files from this directory
    PROJECTDIRECTORY=/../../Project3 

    #Copied to this directory 
    FILEBACKUPLOCATION= /../.../FMonday

    for FILENAME in $PROJECTDIRECTORY/*
    do
        cp $FILENAME $FILEBACKUPLOCATION
        done  

但我不断收到此错误

./fullbackup: line 6: /../../FMonday: Is a directory
cp: missing destination file operand after

【问题讨论】:

  • 你试过等号后面没有空格吗:FILEBACKUPLOCATION=/../.../FMonday
  • /../../Project3 和 /Project3 不一样吗?此外,...具有误导性。无论如何,在目标路径的末尾添加斜杠。
  • 对变量进行双引号也是明智之举,以避免因路径中的空格字符等问题引起的错误。
  • 我认为将目录命名为... 会导致可能出现的错误,请注意... 在某些情况下(Novel NetWare、Windows 95、Golang)具有特殊含义。 --- 在变量引用周围使用双引号也可以更好地表明变量为空或不存在,并且在这种情况下可以更好地处理可能的错误(可以覆盖文件的典型示例:cp path/* $nonexistent_var)。

标签: bash unix terminal


【解决方案1】:

bash 脚本中的变量赋值要求变量名和值之间或值内(除非引用)之间没有空格。由于FILEBACKUPLOCATION= /../.../FMonday 行中存在空格,因此它尝试将/../.../FMonday 作为命令执行(导致第一个错误),并将FILEBACKUPLOCATION 分配给空字符串。然后当另一个命令尝试使用它时,没有分配该变量(考虑到第二个错误)。

【讨论】:

    【解决方案2】:

    我认为你需要的是FILEBACKUPLOCATION=/FMonday/

    【讨论】:

      【解决方案3】:

      就我而言,我只是在文件名后使用了空格和点运算符。效果很好。

      例如,darthVader 是 F 盘内的文件名。所以,我使用了命令“mv /f/darthVader。”

      【讨论】:

        【解决方案4】:

        您是否已经发现变量必须是 FILEBACKUPLOCATION=/location 且没有空格,如果可能的话,请尝试使用类似以下的方式使您的脚本更具可移植性:

        FILEBACKUPLOCATION=$HOME/backup/FMonday
        

        在这种情况下,该位置与您的用户 $HOME 环境变量相关。

        更进一步,如果您想保持 2 个文件同步,您可以使用rsync 做得更好,其中一个优点是它只会复制不存在的文件或更新已更改的文件。

        您确实可以创建一个别名来按需复制/同步文件,例如:

        alias cpr="rsync --delete --archive --numeric-ids --human-readable --no-compress --whole-file --verbose --info=progress2"
        

        那么如果您想将/dir/foo 的内容同步到/dir/bar,只需这样做:

        $ cpr /dir/foo/ /dir/bar/
        

        你的脚本也可能是这样的:

        #!/bin/sh
        
        ORIGIN=/path/to/foo/
        DESTINATION=/path/to/bar/
        
        rsync --delete \
        --archive \
        --numeric-ids \
        --human-readable \
        --no-compress \
        --whole-file \
        --verbose \
        --info=progress2 \
        $ORIGIN $DESTINATION
        

        请注意,在这种情况下使用--no-compress--whole-file 选项,主要是因为文件将被复制到本地,如果远程服务器选项可能不同,请查看此帖子 (The fastest remote directory rsync over ssh archival I can muster (40MB/s over 1gb NICs)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-16
          • 2013-01-10
          • 1970-01-01
          • 2017-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多