【问题标题】:Recursively move folders within subfolders to its parent递归地将子文件夹中的文件夹移动到其父文件夹
【发布时间】:2021-03-04 05:01:21
【问题描述】:

我有一个主文件夹(称为级别 0),其中包含 50 多个子文件夹(级别 1),这些子文件夹包含较低级别的子文件夹和文件(级别 2)。我需要将每个文件夹及其内容从 2 级移动到它的 1 级子文件夹(或相对而言,它的父文件夹)。

为了更好地形象化:

Master folder
├ Parent Folder A
│ ├─ Subfolder A
│ │  ├─ File A
│ │  └─ File B
│ ├─ Subfolder B
│ │  ├─ File C
│ │  └─ Folder D
.
. ... more folders ...
.
└─ Parent folder 134
   ├─ Subfolder CS
   │  ├─ File AGF
   │  └─ File ARH
   ├─ File ROQ
   └─ File JGL

我需要将父文件夹中的文件夹及其文件移动到主文件夹

目标:

Master folder
├─ Subfolder A
│  ├─ File A
│  ├─ File B
│  ├─ File C
│  ├─ File D
│  ├─ File E
│  └─ File F
├─ Subfolder B
│  ├─ File AZA
│  ├─ File AZB
│  ├─ File AZC
│  └─ File AZD
... and so on

这里的问题是有数百个父文件夹和子文件夹,它们都有不同的名称,可能会发生变化。它们的数量也可能发生变化。我不知道从哪里开始。我需要在 bash 脚本中执行此操作,虽然我发现其他人已经这样做了,但他们都是在 powershell 中完成的。 感谢任何人都可以提供的任何帮助。

【问题讨论】:

  • 您可以通过使用 find 并通过 awk 解析输出来创建和执行所需的命令来实现此目的,
  • 我以前从来没有用过这么多的 find 所以我可能错了,但不会 find 正在寻找特定的文件或目录名称?通配符能以某种方式用于我的用例吗?
  • 如果需要,您可以使用 find 查找所有文件和目录,
  • 如果一个 2 级文件夹中有一个 3 级文件夹,其中有一个 4 级文件夹,是保留完整的结构,还是全部展平,只有 1 级下的文件,根本没有子文件夹?
  • 保持原样是我的目标。

标签: bash directory subdirectory


【解决方案1】:

如果我没看错,您希望每个文件夹下的每个文件都从任何子文件夹中移出,直到主文件夹下的第一个文件夹。

一个简单的版本可能如下所示:

$: find # starting test structure
.
./a
./a/a.txt
./a/e
./a/e/ae.txt
./a/f
./a/f/af.txt
./a/g
./a/g/ag.txt
./b
./b/b.txt
./b/e
./b/e/be.txt
./b/f
./b/f/bf.txt
./b/g
./b/g/bg.txt
./c
./c/c.txt
./c/e
./c/e/ce.txt
./c/f
./c/f/cf.txt
./c/g
./c/g/cg.txt
$: for f in $PWD/*/;  # for all the subdirectories in the base folder 
>  do find $f -type f | xargs -Ithis mv this "$f/"; # move all files up to that sub
>     for d in "$f"/*/; do rm -fr "$d"; done;       # and remove all lower empty subs
>  done
$: find # result
.
./a
./a/a.txt
./a/ae.txt
./a/af.txt
./a/ag.txt
./b
./b/b.txt
./b/be.txt
./b/bf.txt
./b/bg.txt
./c
./c/c.txt
./c/ce.txt
./c/cf.txt
./c/cg.txt

编辑

我认为移动子目录会更容易...

$: for b in ./*/*/; do cp -r "$b" ./; rm -fr "$b"; done
$: find
.
./a
./a/a.txt
./b
./b/b.txt
./c
./c/c.txt
./e
./e/ae.txt
./e/be.txt
./e/ce.txt
./f
./f/af.txt
./f/bf.txt
./f/cf.txt
./g
./g/ag.txt
./g/bg.txt
./g/cg.txt

请注意,在我的测试中,我在 a、b 和 c 中的每一个下都有 e、f 和 g,因此文件被收集到单个新的 2 级目录中。如果在类似名称的目录中有任何同名的文件,您将获得最后一个进程。

【讨论】:

  • 感谢您的回答,但我的意思是将实际子目录从其父目录移到主目录中。不过,这可能会在以后派上用场。
猜你喜欢
  • 2018-10-16
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 2022-12-10
相关资源
最近更新 更多