如何从没有文件夹本身的文件夹中复制文件


39

我正在尝试从A文件夹中复制文件和子文件夹,而没有A本身。例如,一个文件夹包含下一个:

| file1.txt   
| file2.txt    
| subfolder1   

执行下一条命令给我错误的结果:

sudo cp -r /home/username/A/ /usr/lib/B/

结果是

/usr/lib/B/A/...copied files...

代替..

/usr/lib/B/...copied files...

没有原始资料夹,我如何才能达到预期的效果

Answers:


67

先进的cp

cp -r /home/username/A/. /usr/lib/B/

这特别好,因为无论目标目录是否存在,它都可以工作。

贝壳球

如果目录中没有太多对象,则可以使用外壳遍历:

mkdir -p /usr/lib/B/
shopt -s dotglob
cp -r /home/username/A/* /usr/lib/B/

同步

rsync -a /home/username/A/ /usr/lib/B/

所述/在源路径的端部是很重要的; 无论目标目录是否已存在都可以工作。

mkdir -p /usr/lib/B/
find /home/username/A/ -mindepth 1 -maxdepth 1 -exec cp -r -t /usr/lib/B/ {} +

或者,如果您不需要空的子目录:

find /home/username/A/ -mindepth 1 -type f -exec cp --parents -t /usr/lib/B/ {} +

(无mkdir


第一个很好用!有什么想法为什么home / username / A / *(带有星号)没有意义?末尾带有圆点的变体帮助了我,谢谢!
pushandpop

@pushandpop A/*确实有意义,但是在某些情况下它不起作用。
Hauke Laging

3
shoptbash具体的。用zsh,用*(D)。与ksh93FIGNORE='@(.|..)'cp -t是GNU特定的。在find一个将无法正常工作,因为它会同时复制A/其内容(包含子目录)几次。
斯特凡Chazelas

1
您还想要-maxdepth 1-mindepth而且-maxdepth现在也受到其他一些人的支持。现在是GNU扩展。find .../. ! -name . -prune -exec ....
StéphaneChazelas 2015年

@StéphaneChazelas我猜某个地方有错字。find .../.在这里导致错误。
Hauke Laging

10

如果在GNU系统上,则来自man cp

   -T, --no-target-directory
          treat DEST as a normal file

这使您可以编写cp -rT /home/username/A/ /usr/lib/B/正确的内容。


这应该是公认的答案,这比shell遍历或使用以外的其他方法更合适cp。但这确实-T适用于非GNU cp
noraj

3

告诉cp要复制目录的内容,而不要复制目录本身:

sudo cp -r /home/username/A/* /usr/lib/B/

谢谢!但是它说:/ usr / lib / B /不是目录
pushandpop

shopt -s dotglob如果中有任何dotfile,则需要使用此文件/home/username/A/
talkloud 2015年

1
@pushandpop好,是的。那是您提出问题的目标,因此我认为它是一个目录。您需要先创建目标,然后再尝试将文件复制到目标中。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.