Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 递归复制文件_Bash_Shell - Fatal编程技术网

Bash 递归复制文件

Bash 递归复制文件,bash,shell,Bash,Shell,我有一个目录结构,如 # parent directory dir/ 此目录下有三个子目录: dir1/dirA/dirB/ dir2/dirC/dirD/ dir3/dirE/dirF/ 我希望将一个文件递归地复制到第一个子目录dir1/dir2/dir3/only中,而不是复制到我正在使用的dirA/dirC/dirE/等子目录中 find . -type d -exec cp filename.txt {} \; 但它也将文件复制到“dir2”和“dir”中。我使用了--min de

我有一个目录结构,如

# parent directory
dir/
此目录下有三个子目录:

dir1/dirA/dirB/
dir2/dirC/dirD/
dir3/dirE/dirF/
我希望将一个文件递归地复制到第一个子目录dir1/dir2/dir3/only中,而不是复制到我正在使用的dirA/dirC/dirE/等子目录中

find . -type d -exec cp filename.txt {} \;

但它也将文件复制到“dir2”和“dir”中。我使用了
--min depth
参数,但没有成功。有什么想法吗?

如果您在
/dir/
中有一个文件,并且希望将其递归复制到
/dir/dir1
中的目录树中,则需要将find命令中的源目录更改为/dir/dir1,如下所示:

find dir -type d -mindepth 1 -maxdepth 1 -exec cp /dir/filename.txt {} \;
如果复制文件的模式变得更加困难,您可以使用
-printf
打印出可能的变体,而不是直接从find复制。例如:

find dir -type d -mindepth 1 -maxdepth 1 -printf "cp %p\n"
希望这有帮助

或者,使用bash语法,您可以跳过find并说:

cd $dir; for d in dir1 dir2 dir3 ; do
  cp filename.txt $d
done
或者只使用三个复制语句

ls -b --file-type | egrep "/$" | xargs -n 1 cp filename.txt
为了说明这一点,
egrep
正在从输出中筛选目录,然后将其作为参数传递给
cp
命令。当然,请记住filename.txt在CWD中,或者修改路径


编辑:此解决方案处理目录名中的空格。

您是否试图
在给定目录结构中的某个位置查找
文件,然后将其复制到
dir1
?我认为除了名称之外,没有任何方法来区分这些目录(好吧,是inode位置,但这没有用,而且不正确)。如果这一个子目录有一些显著的特征,您可以搜索它。否则,
/dir/dir1
/dir/dir2
将过于相似。dir/是父目录,它包含名为filename.txt的文件,我正在使用find将其移动到dir1/-键入d-exec cp filename.txt{}\;但是它会被复制到所有后续的子目录中。如果您只想在dir/dir1中使用它,则不需要递归副本。如果您希望它位于dir/dir1及其下的任何子目录中,那么您可以这样做,但是您显然将
find
限制在您感兴趣的目录树中:
find dir/dir1…
。对不起,这个问题不清楚。您是否要求将文件复制到路径中找到的第一个目录的一般解决方案?如果是这样的话,我必须怀疑它的可用性,但我想不出任何其他理由来使用如此复杂的结构来完成如此简单的任务。恕我直言-WTF-如果这是答案,他可以写“cp/dir/filename.txt/dir/dir1”。在我看来,OP正在寻找一个不同的东西……听起来他想复制到所有的子目录中。我同意Konzua的观点。这样,它将递归地复制到dir/dir1/like dir/dir1/dirA dir/dir1/dirB中的所有子目录。我需要将复制限制为dir1/而不是其子目录。@user3263699很抱歉发送垃圾邮件,但有点不清楚您试图在这里实现什么?@memnoch_proxy-很抱歉。我没有注意到它正在复制到它的所有子文件夹。@user3263699您找到了处理目录名中空格的解决方案了吗。我无法使用“find”命令,所以我编辑了我的答案,改为使用“ls”。我重命名了空间,如find-type d-exec rename'.''.{}\;