繁体   English   中英

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

[英]Move contents of a child folder if parent has the same name with bash

进行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的情况,是否有一种自动的方法可以使用bash删除重复的子文件夹?

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

这是一个可能的解决方案

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

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

我认为它确实达到了预期的目的。 坏处:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM