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

omg*_*omg 421 linux bash cp

将文件复制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
Run Code Online (Sandbox Code Playgroud)

lhu*_*ath 249

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

mkdir -p /foo/bar && cp myfile "$_"
Run Code Online (Sandbox Code Playgroud)

另外,当您只需要在现有层次结构中创建单个目录时,rsync可以在一个操作中执行此操作.事实上,我非常rsync喜欢更多功能的cp替代品:

rsync -a myfile /foo/bar/ # works if /foo exists but /foo/bar doesn't.  bar is created.
Run Code Online (Sandbox Code Playgroud)

  • 在上面的答案中提到了它,但我想再次强调它(由于没有注意到精细打印而浪费了几分钟):上面的`rsync`命令*不等同于`mkdir/cp`命令以上.它只是创建一个级别的文件夹.实际上我不确定它什么时候有用. (7认同)
  • `"$ _"`是一个"bash变量" - [LINK FOR MORE INFO](http://www.thegeekstuff.com/2010/05/bash-shell-special-parameters/#comments). (7认同)
  • 另外,对于想知道`mkdir`的`-p`参数的人,它在http://pubs.opengroup.org/onlinepubs/9699919799/utilities/mkdir.html的POSIX标准中有记录,并导致中间路径名组件成为创建(即使你的`mkdir foo/bar/baz`即使`foo`或`bar`还不存在). (6认同)
  • 这个答案是最好的,因为如果您在谷歌搜索之前遇到先前输入的cp命令,您可以轻松地"按住ctrl + a"来查看错误思考的`cp`命令的开头并更正它.谢谢! (4认同)
  • @PengheGeng:是的,这个rsync命令只能创建一个级别的文件夹,但是rsync可以选择创建所有文件夹,或者只创建一些文件夹.[rsync:如何配置它以在服务器上创建目标目录?](/sf/ask/114582261/) (3认同)

Chr*_*ian 104

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

你可以用mkdir来做..

mkdir -p /var/path/to/your/dir
Run Code Online (Sandbox Code Playgroud)

编辑 请参阅lhunath 关于合并cp 的答案.

  • cp(1)没有.mkdir -p/foo/bar && cp myfile"$ _"确实是可靠地执行此操作的唯一方法. (44认同)
  • lhunath的评论是最正确和完整的答案 (3认同)

eyt*_*ort 24

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

例如,我这样做了

ditto 6.3.2/6.3.2/macosx/bin/mybinary ~/work/binaries/macosx/6.3.2/
Run Code Online (Sandbox Code Playgroud)

~/work运行命令之前,哪里没有包含二进制目录.

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

rsync 6.3.3/6.3.3/macosx/bin/mybinary ~/work/binaries/macosx/6.3.3/
Run Code Online (Sandbox Code Playgroud)

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


Jam*_*dle 22

 mkdir -p `dirname /nosuchdirectory/hi.txt` && cp -r urls-resume /nosuchdirectory/hi.txt
Run Code Online (Sandbox Code Playgroud)


vic*_*ugo 18

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

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

#!/bin/bash
if [ ! -d "$2" ]; then
    mkdir -p "$2"
fi
cp -R "$1" "$2"
Run Code Online (Sandbox Code Playgroud)

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

./cp-improved SOURCE DEST
Run Code Online (Sandbox Code Playgroud)

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

  • 如果有人在处理时尝试重命名文件,那将导致奇怪的结果:`cp-improved /foo/file.jpg/bar/file.jpg.bak`.无论是否存在"bar",我都会以`/ bar/file.jpg.bak/file.jpg`结束 (8认同)
  • 请引用你的参数扩展.或者你会遇到由wordplitting和pathname扩展引入的bug.在你所有的$ foo周围加上"". (3认同)

小智 17

也可以使用命令find:

find ./ -depth -print | cpio -pvd newdirpathname
Run Code Online (Sandbox Code Playgroud)


Chu*_*Lai 10

rsync是有效的!

#file:
rsync -aqz _vimrc ~/.vimrc

#directory:
rsync -aqz _vim/ ~/.vim
Run Code Online (Sandbox Code Playgroud)

  • 不起作用.. rsync 只会为您创建一个目录。 (3认同)