如何用cp排除不同级别的子目录?

如何用cp排除不同级别的子目录?

这是我原来帖子的后续问题:find & cp 命令不复制一级目录

我有一个这样的目录结构:

test folders
├── 1
│   ├── 1-1
│   ├── 1-2
│   └── 1-3
├── 2
│   ├── 2-1
│   ├── 2-2
│   └── 2-3
├── 3
│   ├── 3-1
│   ├── 3-2
│   └── 3-3
└── 4
    ├── 4-1
    ├── 4-2
    └── 4-3

16 directories, 0 files

我正在努力仅复制第一级文件夹 - 1,2,3,4 不包括使用find&cp命令的所有子文件夹

├── 1
├── 2
├── 3
└── 4

工作目录是/home/username/Downloads/test folders.

我失败的尝试在链接的问题中。在那里我们已经确定了一个事实,即cp看不到find带有 的命令-maxdepth

是否有另一个命令find可以cp使-maxdepth复制文件变得更容易?是否有-maxdepth相当于cp, iffind的命令 can't be linked with 的命令cp

[编辑]:另外,我只想复制第一级目录,例如1、2、3和4。我不想复制文件。对困惑感到抱歉

答案1

如果您只想复制目录而不复制文件或子目录,很简单:

terdon@oregano test folders $ tree
.
├── 1
│   ├── 1-1
│   ├── 1-2
│   ├── 1-3
│   ├── file-1
│   └── file-2
├── 2
│   ├── 2-1
│   ├── 2-2
│   ├── 2-3
│   ├── file-1
│   └── file-2
├── 3
│   ├── 3-1
│   ├── 3-2
│   ├── 3-3
│   ├── file-1
│   └── file-2
└── 4
    ├── 4-1
    ├── 4-2
    ├── 4-3
    ├── file-1
    └── file-2

17 directories, 8 files

使用上面的示例,您可以使用以下命令重新创建顶级目录:

terdon@oregano test folders $ find . -maxdepth 1 -type d -exec mkdir ../results/{} \;
mkdir: cannot create directory ‘../results/.’: File exists
$ tree ../results/
../results/
├── 1
├── 2
├── 3
└── 4

5 directories, 0 files

您可以安全地忽略该错误消息。那只是因为它还找到.当前目录,并尝试创建../results/.已经存在的当前目录。

如果您还想复制顶级文件,可以分两步完成:

terdon@oregano test folders $ find . -maxdepth 1 -type d -exec mkdir ../results/{} \;
mkdir: cannot create directory ‘../results/.’: File exists
$ find . -maxdepth 2 -type f -exec cp {} ../results/{} \;

其产生:

$ tree ../results/
../results/
├── 1
│   ├── file-1
│   └── file-2
├── 2
│   ├── file-1
│   └── file-2
├── 3
│   ├── file-1
│   └── file-2
└── 4
    ├── file-1
    └── file-2

您还可以通过以下方式一次性完成此操作:

$ find . -maxdepth 1 -type d -exec sh -c 'mkdir ../results/$1 && cp {}/* ../results/$1' sh {} \;
mkdir: cannot create directory ‘../results/.’: File exists
cp: -r not specified; omitting directory './3/3-1'
cp: -r not specified; omitting directory './3/3-2'
cp: -r not specified; omitting directory './3/3-3'
cp: -r not specified; omitting directory './1/1-1'
cp: -r not specified; omitting directory './1/1-2'
cp: -r not specified; omitting directory './1/1-3'
cp: -r not specified; omitting directory './4/4-1'
cp: -r not specified; omitting directory './4/4-2'
cp: -r not specified; omitting directory './4/4-3'
cp: -r not specified; omitting directory './2/2-1'
cp: -r not specified; omitting directory './2/2-2'
cp: -r not specified; omitting directory './2/2-3'

由于我们使用cpwithout -r,因此只会复制文件。您会收到这些警告,但同样,您可以安全地忽略它们。您还可以通过重定向到以下方式使它们静音/dev/null

find . -maxdepth 1 -type d -exec sh -c 'mkdir ../results/$1 && cp {}/* ../results/$1' sh {} \; 2>/dev/null

相关内容