首页 文章

如何让cp命令创建任何必要的文件夹,用于将文件复制到目标[重复]

提问于
浏览
367

这个问题在这里已有答案:

使用 cp 将文件复制到可能存在或不存在的文件夹时,如何在必要时获取 cp 来创建文件夹?这是我尝试过的:

[root@file nutch-0.9]# cp -f urls-resume /nosuchdirectory/hi.txt
cp: cannot create regular file `/nosuchdirectory/hi.txt': No such file or directory

9 回答

  • 89

    我不知道你能用cp做到这一点 .

    你可以用mkdir来做..

    mkdir -p /var/path/to/your/dir
    

    EDIT 请参阅lhunath的answer以了解cp .

  • -16

    没有这样的选择 . 你可以做的是在复制文件之前运行mkdir -p

    我制作了一个非常酷的脚本,您可以使用它来复制不存在的位置的文件

    #!/bin/bash
    if [ ! -d "$2" ]; then
        mkdir -p "$2"
    fi
    cp -R "$1" "$2"
    

    现在只需保存它,赋予它权限并使用它运行它

    ./cp-improved SOURCE DEST
    

    我把-R选项,但它只是一个草稿,我知道它可以,你会在很多方面改进它 . 希望它能帮到你

  • -5

    为了扩展Christian的答案,唯一可行的方法是将 mkdircp 结合起来:

    mkdir -p /foo/bar && cp myfile "$_"
    

    另外,当您只需要在现有层次结构中创建单个目录时, rsync 可以在一个操作中完成 . 事实上,我非常喜欢 rsync 作为一个更加多才多艺的替代品 .

    rsync -a myfile /foo/bar/ # works if /foo exists but /foo/bar doesn't.  bar is created.
    
  • 21

    对于那些使用Mac OSX的人来说,解决这个问题的最简单方法可能就是使用ditto(仅限于mac,AFAIK) . 它将创建目标中缺少的目录结构 .

    例如,我这样做了

    ditto 6.3.2/6.3.2/macosx/bin/mybinary ~/work/binaries/macosx/6.3.2/
    

    在运行命令之前, ~/work 不包含二进制目录 .

    我认为rsync应该工作类似,但它似乎只适用于一个级别的丢失目录 . 那是,

    rsync 6.3.3/6.3.3/macosx/bin/mybinary ~/work/binaries/macosx/6.3.3/
    

    工作,因为〜/ work / binaries / macosx存在但不是〜/ work / binaries / macosx / 6.3.2 /

  • 15
    mkdir -p `dirname /nosuchdirectory/hi.txt` && cp -r urls-resume /nosuchdirectory/hi.txt
    
  • 204

    rsync是有效的!

    #file:
    rsync -aqz _vimrc ~/.vimrc
    
    #directory:
    rsync -aqz _vim/ ~/.vim
    
  • 17
    cp -Rvn /source/path/* /destination/path/
    cp: /destination/path/any.zip: No such file or directory
    

    如果路径中包含源文件,它将在目标中不创建现有路径 . 这不会创建空目录 .

    刚才我见过xxxxxxxx:没有这样的文件或目录,因为我用完了空闲空间 . 没有错误消息 .

    与同上:

    ditto -V /source/path/* /destination/path
    ditto: /destination/path/any.zip: No space left on device
    

    一旦释放空间 cp -Rvn /source/path/* /destination/path/ 按预期工作

  • 8

    也可以使用命令 find

    find ./ -depth -print | cpio -pvd newdirpathname
    
  • 15

    令人惊讶的是,我没有在这个帖子中看到正确的答案,只需使用:

    cp -r /foo/bar/baz /tmp
    

    像往常一样,一个简单的RTFM建议就足够了,上面会在/ tmp和子目录foo / bar下复制baz文件(如果它们不存在则会创建它们)

    cp --help
    -R, -r, --recursive          copy directories recursively
    

相关问题