Linux 为什么子目录中的文件没有被复制?

Linux 为什么子目录中的文件没有被复制?,linux,bash,shell,cp,Linux,Bash,Shell,Cp,我必须制作一个脚本,将所有文件从一个以“db.”开头的特定位置复制到另一个位置。我的脚本适用于直接位于目录中的所有文件,但它不会复制子目录中的任何文件。我使用了参数-r,它是否应该递归复制所有内容?为什么它不起作用?我怎样才能使它起作用 我的剧本: #! /bin/bash #Script zum kopieren aller Dateien welche mit "db." beginnen. #User input echo -n 'Enter path to copy from: '

我必须制作一个脚本,将所有文件从一个以“db.”开头的特定位置复制到另一个位置。我的脚本适用于直接位于目录中的所有文件,但它不会复制子目录中的任何文件。我使用了参数-r,它是否应该递归复制所有内容?为什么它不起作用?我怎样才能使它起作用

我的剧本:

#! /bin/bash

#Script zum kopieren aller Dateien welche mit "db." beginnen.

#User input
echo -n 'Enter path to copy from: '
read copypath

echo -n 'Enter path to save to: '
read savepath

cp -r $copypath/db.* $savepath

echo 'Done.

-r
在这里不起作用,因为您没有向
cp
提供任何源目录

在执行
cp
之前
bash
展开
*
并将结果文件列表提供给
cp
cp
然后只会看到类似于
cp-r 1stFile 2ndFile 3rdFile的内容。。。targetDirectory
--因此
-r
无效

正如评论中指出的,您必须使用
bash
的globstar功能
**
查找
。此外,你应该养成引用变量的习惯

# requires bash 4.0 or higher (from the year 2009, but OS X has a really outdated version)
shopt -s globstar
cp "$copypath"/**/db.* "$savepath"


从我的评论中做出回答


请尝试
$copypath/db.*
后跟
$copypath/**/db.*


第一个用于顶级目录(copypath),下一个用于任何子目录。

尝试
$copypath/db.*
然后是
$copypath/**/db.*
您可以使用find命令:
查找$copypath-键入f-名称“db.*-exec cp{}$savepath\
@Siddharth它对位于
$copypath/
@Ursescu-Ionut中的顶级文件不起作用,我想发出的两个命令都会起作用。第一个是顶层,第二个是所有子目录?我猜乌塞斯库·伊奥尼被
a/**/b
误导了,这看起来好像在
a
b
之间必须有一个目录。但是,globstar也匹配
a/b
。或者您可以使用类似的
查找“$copypath”-键入f-name“db.*”| xargs cp-t“$savepath”
@Bogdan Stoica这里
xargs
的优点是什么?我怀疑它会更慢,更不安全(想想带空格甚至换行符的文件名)。你说得对,我只是说这也是一个可能的选择,没有别的。。。
find "$copypath" -type f -name 'db.*' -exec cp -t "$savepath" {} +