查找文件列表,创建目录并在linux中复制这些文件

查找文件列表,创建目录并在linux中复制这些文件,linux,cp,Linux,Cp,例如,我想从不同的目录复制“file to be copy.txt” /home/user1/file-to-be-copied.txt /home/user2/file-to-be-copied.txt /home/user3/file-to-be-copied.txt /home/user4/user1/file-to-be-copied.txt /home/user4/user2/file-to-be-copied.txt /home/user4/user3/file-to-be-cop

例如,我想从不同的目录复制“file to be copy.txt”

/home/user1/file-to-be-copied.txt
/home/user2/file-to-be-copied.txt
/home/user3/file-to-be-copied.txt
/home/user4/user1/file-to-be-copied.txt
/home/user4/user2/file-to-be-copied.txt
/home/user4/user3/file-to-be-copied.txt
然后根据用户帐户创建一个新目录

/home/user4/user1/
/home/user4/user2/
/home/user4/user3/
然后将“要复制的文件.txt”复制到新创建的目录中

/home/user1/file-to-be-copied.txt
/home/user2/file-to-be-copied.txt
/home/user3/file-to-be-copied.txt
/home/user4/user1/file-to-be-copied.txt
/home/user4/user2/file-to-be-copied.txt
/home/user4/user3/file-to-be-copied.txt
我只知道应该使用bash脚本来完成,但我不知道怎么做。这就是我要走的路了

find /home . "file-to-be-copied.txt" | xargs -i mkdir ... cp {} ...

不需要find,更重要的是:不需要xargs(这对于find几乎总是多余的,因为find有-exec)


这是我使用的代码


    for f in $(find '/home' -name 'file-to-be-copied.txt')
      do
        tmpname=${f%/*}
        dirname=${tmpname##*/}
        mkdir -p /home/user4/$dirname && /bin/cp -p $f /home/user4/$dirname

        echo $f copied to /home/user4/$dirname
      done

我认为
mkdir&&cp
部分有点错误:它应该复制到
/home/user4
。home和file-to-be-copy.txt不需要掩蔽。优雅,但绝对只限于Linuxcp支持
--parent
,而Mac OS X上的
cp
(可能来自FreeBSD userland?)不支持。cp选项不应该是--parents()?我认为这是一个打字错误,但我建议的修改答案的建议被拒绝了两次。@SteveMadsen:既然问题被标记为“Linux”,我想你可以原谅它。而且AFAIK GNU cp是免费的、开源的,因此它可以在Linux以外的更多平台上使用。@Chilledrat:谢谢,采用了。手册页将它记录为
--parents
,但它也可以在没有“s”的情况下工作。