将当前目录的内容复制到子目录


Answers:


12

如果要递归复制文件夹的内容(将引发1错误,请参见以下替代方法):

cp -r * sub/

有点黑,但可用于非空子目录:

TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"

另一个单线:

TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done

还是递归的:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done

如果sub /不为空,这将不起作用-> sub将再次复制到sub中,除非@Oguz想要。

好的,我终于对find代码满意:D
Lekensteyn,2010年

2
您的第二个命令对于包含空格的文件名失败。使用xargs-exec。无需grep使用! -name "$TARGETDIR"或类似用途。您周围的报价无与伦比$file。我认为cp,除了第一个命令外,递归不会像您期望的那样工作。
暂停,直到另行通知。

沃哈(Wohaa),错过了最后一个代码中的引号。很好的评论丹尼斯,在这种情况下我从未想到使用-name :)
Lekensteyn 2010年

4

target如果您的shell是bash,则假设为目标子目录的名称:

shopt -s extglob
cp -r !(target) target/

在ksh中,您可以直接执行cp -r !(target) target/

在zsh中,你可以做setopt ksh_glob,然后cp -r !(target) target/setopt extended_glob然后是另一种可能性cp -r ^target target/


2

我建议将目标目录移到源目录之外,然后再次放回原处。mv是免费的(如果您注意不要移动到其他文件系统),除非您期望其他进程会干扰/干扰。

如果文件名中有空格,则上面发布的大多数解决方案将不起作用。我建议使用find -print0 |的变体。xargs -0或find -exec等


0

这对您有用吗?

cp -r * subdir/

如果您打算移动而不是将当前目录中的所有内容都复制到子目录中,则可以执行以下操作:

mv * subdir/

这不会处理非空目录

我刚刚进行了测试,并且效果很好。
karlphillip 2010年

您需要像@Lekensteyn建议的那样以递归方式复制非空目录。

-1

这会将所有内容(包括点文件,不包括目标目录本身)复制到目标目录SUBDIR

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done

2
包含空格的文件名失败。
暂停,直到另行通知。

-1

这进去说文件dirCopy.sh



for i in `ls`
do
        if [ $i != "subDir" ]
        then
                `cp -r $i subDir`
        fi
done

在控制台中将其作为“ sh dirCopy.sh”运行


2
不需要lsfor file in *。不需要反引号-使用$()。不需要$()cp命令前后加上引号(或)(这将产生错误消息)。
暂停,直到另行通知。
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.