Linux:将文件从未知文件夹移动到同一未知文件夹的未知父文件夹

Linux:将文件从未知文件夹移动到同一未知文件夹的未知父文件夹

这个标题吸引到你的注意了,不是吗?哈哈。

问题:我有很多文件夹,每个文件夹里面都有一个文件夹,里面有文件。我想将第二级文件移动到第一级,但不知道它们的名称。

从图形上看,这就是我想要的:

当前的:

new
└── temp
    ├── Folder1
    │   ├── SubFolder1
    │   │   └── SubTest1.txt
    │   └── Test1.txt
    ├── Folder2
    │   ├── SubFolder2
    │   │   └── SubTest2.txt
    │   └── Test2.txt
    └── Folder3
        ├── SubFolder3
        │   └── SubTest3.txt
        └── Test3.txt

期望:

└── temp
    ├── Folder1
    │   ├── SubFolder1
    │   ├── SubTest1.txt
    │   └── Test1.txt
    ├── Folder2
    │   ├── SubFolder2
    │   ├── SubTest2.txt
    │   └── Test2.txt
    └── Folder3
        ├── SubFolder3
        ├── SubTest3.txt
        └── Test3.txt

如果有人想要更花哨一点,我不需要这样做,因为稍后我会在脚本中删除空文件,但值得一提的是,以防万一我可以学到更多:

└── temp
    ├── Folder1
    │   ├── SubTest1.txt
    │   └── Test1.txt
    ├── Folder2
    │   ├── SubTest2.txt
    │   └── Test2.txt
    └── Folder3
        ├── SubTest3.txt
        └── Test3.txt

我已经非常接近了,但我遗漏了一些东西,我确信这很简单/愚蠢。以下是我正在运行的内容:

 find . -mindepth 3 -type f -exec sh -c 'mv -i "$1" "${1%/*}"' sh {} \;

这就是我得到的结果:

mv: './1stlevel/2ndlevel/test.rtf' and './1stlevel/2ndlevel/test.rtf' are the same file

堆栈溢出乔治通过给我以下信息让我更接近:

find . -mindepth 4 -type f -exec mv {} ./*/* \; 

也:

mv ./*/*/*/* ./*/*

mv 命令肯定是最佳选择,因为它更简洁,速度也更快。但是,遗憾的是,虽然它在一个文件夹中运行良好,但多个文件夹就会变成这样:

new
└── temp
    └── Folder3
        ├── Folder1
        │   ├── SubFolder1
        │   └── Test1.txt
        ├── Folder2
        │   ├── SubFolder2
        │   └── Test2.txt
        ├── SubFolder3
        ├── SubTest1.txt
        ├── SubTest2.txt
        ├── SubTest3.txt
        └── Test3.txt

所以,我越来越接近目标了,但还没有完全实现。有什么建议吗?提前谢谢!

答案1

您可以使用 for 循环来简化此过程。我使用目录名 $tiem/.. 来获得一个级别,并使用 mindepth 将效果限制在一个级别。

localhost$ tree
.
└── temp
    ├── folder1
    │   ├── subfolder1
    │   │   └── file1
    │   └── test1.txt
    ├── folder2
    │   ├── subfolder2
    │   │   └── file2
    │   └── test2.txt
    └── folder3
        ├── subfolder3
        │   └── file3
        └── test3.txt

7 directories, 6 files
/tmp/foo/new

localhost$ for item in `find . -mindepth 4 -type f`; do echo $item `dirname $item`/..; done
./temp/folder1/subfolder1/file1 ./temp/folder1/subfolder1/..
./temp/folder3/subfolder3/file3 ./temp/folder3/subfolder3/..
./temp/folder2/subfolder2/file2 ./temp/folder2/subfolder2/..

移动后变成

localhost$ for item in `find . -mindepth 4 -type f`; do mv $item `dirname $item`/..; done
/tmp/foo/new
localhost$ tree
.
└── temp
    ├── folder1
    │   ├── file1
    │   ├── subfolder1
    │   └── test1.txt
    ├── folder2
    │   ├── file2
    │   ├── subfolder2
    │   └── test2.txt
    └── folder3
        ├── file3
        ├── subfolder3
        └── test3.txt

7 directories, 6 files
/tmp/foo/new

localhost$

希望有所帮助。

相关内容