How to have the cp command create any necessary folders for copying a file to a destination
当使用cp将文件复制到可能存在或可能不存在的文件夹时,如果需要,如何让cp创建文件夹?以下是我的尝试:
1 2
| [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 |
- @Nelaar问题的年龄是次要问题;答案的质量和广度应是决定因素。我也没有一个强烈的偏好,但我认为这不值得努力扭转重复的关系。如果您不这么认为,请提供一个理由(可能在meta.stackoverflow.com上,以获得适当的可见性和流程)。
- 找了同样的东西,找不到下面我的答案,所以我会贴出我是如何做到这一点的:dirname"/nosuchdirectory/hi.txt" | while read path;do mkdir -p"$path"; done && cp -f urls-resume /nosuchdirectory/hi.txt。
- 如meta.stackoverflow.com/questions/251938/…
为了进一步说明基督教徒的答案,唯一可靠的方法是将mkdir和cp结合起来:
1
| mkdir -p /foo/bar && cp myfile"$_" |
另外,当您只需要在现有的层次结构中创建一个目录时,rsync可以在一个操作中完成。我是rsync的忠实粉丝,事实上,我是一个多才多艺的cp替代品:
1
| rsync -a myfile /foo/bar/ # works if /foo exists but /foo/bar doesn't. bar is created. |
- 上面的答案已经提到了,但我想再强调一下(因为没有注意到细节而浪费了几分钟):上面的rsync命令不等于上面的mkdir/cp命令。它只是创建一个单一级别的文件夹。实际上,我不确定什么时候有用。
- 这个答案是最好的,因为如果你在谷歌搜索之前一直使用你先前输入的cp命令,你可以很容易地用ctrl + a进入你的错误想法的cp命令的开头,并纠正它。谢谢您!
- 另外,对于任何对mkdir的-p参数感到疑惑的人来说,它被记录在pubs.opengroup.org/onlinepubs/9699919799/utilities/mkdir.htm‌&误8203;l的posix标准中,并导致创建中间路径名组件(即,即使foo或bar不存在也允许您使用mkdir foo/bar/baz)。
- "$_"是一个bash variable链接以获取更多信息。
- 关于bash变量的更多信息:stackoverflow.com/a/5163260/3982562
- @是的,这个rsync命令只能创建一级文件夹,但是rsync可以选择全部或部分创建。rsync:如何配置它在服务器上创建目标目录?
- 真烦人。这应该在cp上执行。
我不知道你能用CP做到这一点。
你可以用mkdir来完成。
1
| mkdir -p /var/path/to/your/dir |
编辑请参阅lhunath关于合并CP的回答。
- cp(1)没有。mkdir-p/foo/bar&;&;cp myfile"$uuu"确实是可靠实现这一点的唯一方法。
- lhunath的评论是最正确和最完整的答案。
- @你不应该把你的评论作为答案提交。
- @Artb,作为答案提交。
- 检查这个答案-stackoverflow.com/a/34608146/2007944
- 这个anwser不应该在这里。问题是关于cp而不是mkdir的……
- 您好,@karlmorrison这是一个8年前的问题和答案。我还说这是为了mkdir而不是cp。
- @克里斯蒂安,我知道,现在是2017年,这是问题的直接答案,不应该是。我知道你说过,但是像我这样的人实际上在寻找关于cp命令的答案时,会遇到这样的答案,这与cp延长我寻找正确答案的时间无关。这里唯一准确的答案是stackoverflow.com/a/947971/1137669,他说cp不能做到。没有人(包括你自己)说用cp是不可能的。
- 江户十一〔六〕不是现在就完成了吗?
对于那些在MacOSX上的用户,解决这个问题的最简单方法可能是使用DITTO(不过,只有在Mac、Afaik上)。它将创建目标中缺少的目录结构。
例如,我这样做了
1
| ditto 6.3.2/6.3.2/macosx/bin/mybinary ~/work/binaries/macosx/6.3.2/ |
其中~/work在我运行命令之前没有包含二进制文件目录。
我认为rsync的工作原理应该类似,但它似乎只适用于一个丢失目录的级别。也就是说,
1
| 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/
- 我喜欢这样,但问题是当你在非Mac环境中时会被卡住。最好学习平台不可知论的方法。还要注意,我相信rsync可以使用标记-avr创建dir。
1
| mkdir -p `dirname /nosuchdirectory/hi.txt` && cp -r urls-resume /nosuchdirectory/hi.txt |
没有这样的选择。您可以在复制文件之前运行mkdir-p
我做了一个非常酷的脚本,你可以用它在不存在的地方复制文件。
1 2 3 4 5
| #!/bin/bash
if [ ! -d"$2" ]; then
mkdir -p"$2"
fi
cp -R"$1""$2" |
现在只需保存它,授予它权限并使用
1
| ./cp-improved SOURCE DEST |
我提出-r选项,但它只是一个草案,我知道它可以,你会在很多方面改进它。希望它能帮助你
- 请引用您的参数扩展。否则,您将遭受分词和路径名扩展带来的错误。把"所有的$foo"放在周围。
- 如果有人在处理时试图重命名文件,这将导致奇怪的结果:cp-improved /foo/file.jpg /bar/file.jpg.bak。不管是否存在bar,我都会以/bar/file.jpg.bak/file.jpg结束。
还可以使用命令find:
1
| find ./ -depth -print | cpio -pvd newdirpathname |
RSyc就是工作!
1 2 3 4 5
| #file:
rsync -aqz _vimrc ~/.vimrc
#directory:
rsync -aqz _vim/ ~/.vim |
1 2
| cp -Rvn /source/path/* /destination/path/
cp: /destination/path/any.zip: No such file or directory |
如果路径中有源文件,它将不会在目标中创建现有路径。这不会创建空目录。
刚才我看到了XXXXXXX:没有这样的文件或目录,因为我的可用空间不足。无错误信息。
同上:
1 2
| ditto -V /source/path/* /destination/path
ditto: /destination/path/any.zip: No space left on device |
一旦释放空间,cp -Rvn /source/path/* /destination/path/就会按预期工作。