Linux 如果父文件夹与bash同名,则移动子文件夹的内容

Linux 如果父文件夹与bash同名,则移动子文件夹的内容,linux,bash,tar,Linux,Bash,Tar,在执行tar提取操作时,有时内容会直接提取到父文件夹,这很糟糕,因为它们都变得杂乱无章。举例来说: tar -xzf foo1.tar.gz tar -C foo -xzf foo1.tar.gz 摘录: ./file1 ./file2 ./file3 ./foo1/file1 ./foo1/file2 ./foo1/file3 解决方案是通过以下示例为tar.gz创建一个特定文件夹: tar -xzf foo1.tar.gz tar -C foo -xzf foo1.tar.gz

在执行tar提取操作时,有时内容会直接提取到父文件夹,这很糟糕,因为它们都变得杂乱无章。举例来说:

tar -xzf foo1.tar.gz
tar -C foo -xzf foo1.tar.gz
摘录:

./file1
./file2
./file3
./foo1/file1
./foo1/file2
./foo1/file3
解决方案是通过以下示例为tar.gz创建一个特定文件夹:

tar -xzf foo1.tar.gz
tar -C foo -xzf foo1.tar.gz
摘录:

./file1
./file2
./file3
./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删除需要的重复子文件夹?

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

这是一种可能的解决方案

要将文件从子目录移动到顶级目录,请执行以下操作:

find ! -name . -maxdepth 1 -type d | xargs -I {} sh -c "find {}/{} -maxdepth 1 | xargs -I [] echo \"mv [] {}\""
这是因为如果子文件夹不存在,则“查找”不会执行任何操作:

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
我认为它达到了预期目的。缺点:


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

你能发布一个可运行的示例将其计算到哪里吗?他使用的是
basename
,因此在他这样做之后,文件名中没有目录。我不明白这个问题。第二个
foo3
来自哪里?你的代码似乎对在子目录中找到的tar文件也不起作用,因为
basename
删除目录。不,如果.tar.gz在子目录中,我就不工作,不是这样。你是在问如何做一些不同的事情,这取决于tar文件的所有文件都在顶层,还是它的所有文件都在与tar文件同名的子目录中?你可以先做
tar-t foo.tar.gz
然后再做检查第一个文件名是否以
/
开头,并仅在这种情况下使用
-C