这个标题吸引到你的注意了,不是吗?哈哈。
问题:我有很多文件夹,每个文件夹里面都有一个文件夹,里面有文件。我想将第二级文件移动到第一级,但不知道它们的名称。
从图形上看,这就是我想要的:
当前的:
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$
希望有所帮助。