如果父文件夹名称与子文件夹相同,使用bash移动子文件夹的内容

3
有时在执行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删除重复的子文件夹,以适应需要这样做的情况?


我不明白这个问题。第二个foo3是从哪里来的? - undefined
你的代码似乎也无法处理子目录中的tar文件,因为basename会移除目录信息。 - undefined
不,如果.tar.gz文件在子目录中,我就不会工作,但这并不是情况。 - undefined
是的,这正是我在问的。 - undefined
1
你可以先执行 tar -t foo.tar.gz 命令,然后检查第一个文件名是否以 ./ 开头,只有在这种情况下才使用 -C 参数。 - undefined
显示剩余3条评论
2个回答

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

我认为它完成了预期的功能。缺点是:它显示了许多无害的错误。

0

计算目录中的条目数量(提示:dotglob(*)${#var[@]}),如果单个目录条目具有相同的名称,则复制属性并移动内容(请注意,该目录中可能还有与之相同名称的其他内容),然后删除现在为空的目录。


你能贴一个可以运行的示例吗? - undefined
计算在哪里?他正在使用basename,所以在他执行该操作之后,文件名中没有目录。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接