如果父级与bash具有相同的名称,则移动子文件夹的内容

时间:2014-02-28 22:35:59

标签: linux bash tar

当进行tar提取操作时,有时内容会直接提取到父文件夹,因为它们会变得混乱。例如:

tar -xzf foo1.tar.gz

提取物:

./file1
./file2
./file3

解决方法是为tar.gz创建一个特定的文件夹。例如:

tar -C foo -xzf foo1.tar.gz

提取物:

./foo1/file1
./foo1/file2
./foo1/file3

所以,如果我有很多.tar.gz要提取,我会这样做:

find -name \*.tar.gz | xargs -n 1 basename -s .tar.gz | xargs -I {} tar -C {} -xzf {}.tar.gz

要安全地提取它们,但我会最终得到这样的东西:

./foo3/foo3/file1
./foo3/foo3/file2
./foo3/foo3/file3

对于那些需要它的情况,是否有一种自动方法可以使用bash删除重复的子文件夹?

2 个答案:

答案 0 :(得分:0)

计算目录中的条目数(提示:dotglob(*)${#var[@]}),如果单个目录条目具有相同的名称,则复制属性并移动内容(请注意,您可能在该目录中有某些内容具有相同的名称),然后删除now-empty目录。

答案 1 :(得分:0)

这是一种可能的解决方案

将文件从子目录移动到顶层目录:

find ! -name . -maxdepth 1 -type d | xargs -I {} sh -c "find {}/{} -maxdepth 1 | xargs -I [] echo \"mv [] {}\""

这是有效的,因为如果子文件夹不存在,则find将不执行任何操作:

find foo4/foo4 
find: 'foo4/foo4': No such file or directory

删除已恢复的子目录

find ! -name . -maxdepth 1 -type d | xargs -I {} find {}/{} -type d -maxdepth 1 | xargs rmdir

我认为它确实符合它的目的。缺点:

它显示了许多无害的错误。