【问题标题】:Flatten some directories but not others automatically?自动展平一些目录而不是其他目录?
【发布时间】:2013-07-16 13:37:08
【问题描述】:

我有一个目录,里面有几千个子目录(但是这些子目录中没有子目录),我只需要展平一些子目录的内容,所以基本上将这些目录的内容带到根目录。

但我无法对所有子目录执行此操作,而且我无法展平的子目录中有多个文件。

有什么方法可以自动执行此操作? Python 脚本、perl 脚本、bash 或其他什么?我真的,真的,真的不想手动做这个......

【问题讨论】:

  • 一般来说,也许。 ;) 您是否有用于确定目录是否要展平的可编程标准?
  • 就像我说的,如果目录中只有一个文件,则必须将目录展平。我不知道这是否是可编程标准...
  • 感谢您的澄清。您最初的问题陈述说,“......我无法展平的文件中有多个文件”(即,如果一个文件夹有多个文件,它不会展平“)这 not 暗示具有一个文件的每个文件夹都被展平(如果一个文件夹有一个文件,则它被展平)。所以您的附加评论会有所帮助。

标签: automation directory flatten


【解决方案1】:

类似这样的东西,在bashfoo代表你要展平的目录):

for x in foo/*
do
    COUNT=`ls -1 "$x" | wc -l`

    if ([ -d "$x" ] && (test $COUNT -le 1))
    then
        if test $COUNT -eq 1; then
            mv "$x"/* $1
        fi
        rmdir "$x"
    fi
done

这也会从foo 中删除一个空子目录。

你也可以把它放到一个shell脚本文件中,并使用$1作为目录名:

# Exit it a directory name isn't given

if [ "$1" = "" ] ; then
    echo "Usage: $0 directory"
    echo "Flattens directory"
    exit
fi

for x in "$1"/*
do
    COUNT=`ls -1 "$x" | wc -l`

    if ([ -d "$x" ] && (test $COUNT -le 1))
    then
        if test $COUNT -eq 1; then
            mv "$x"/* "$1"
        fi
        rmdir "$x"
    fi
done

您可以将其放入名为 flatten 的文件中,然后运行 ​​sh flatten foo 以展平目录 foo。或者,chmod +x flatten 并运行 ./flatten foo。最后,如果您随着时间的推移经常使用它,您可以将其移动到我们的PATH 中的目录,这样您就可以输入flatten foo。我在 Linux 的主目录中拥有一个 bin 文件,我在其中放置了我登录时想要的自己的工具,并将我的 ~/bin 放在我的 PATH 中(在 bash 配置文件中设置)。

【讨论】:

  • 当我尝试运行它时,它看起来像是试图从整个系统的根目录中删除目录...
  • 在我的第一句话中,我说“$1 代表您要展平的目录”。您必须将$1 设置为您想要的目录。如果你把它放到一个shell脚本文件中,比如foo,那么你可以运行foo my_dir。我已经编辑了答案以使其非常清楚。
  • 好的,当我现在尝试运行它时,它失败了,因为它似乎无法支持包含多个单词的目录名称,而是带来了一堆错误,例如:@ 987654341@ls: is: no such file or directoryls: a: no such file or directoryls: test: no such file or directory./foo: line 13: [: too many arguments我在做傻事吗?
  • @user2587581,不,你没有做任何愚蠢的事情。我忽略了引用 $x 的路径名来处理嵌入的空格。我已经修改过了。
  • 太棒了,它现在可以完美运行了。唯一奇怪的是,它说有些目录不为空而忽略其他目录,根本没有任何模式。但这仅发生在 7 个目录中,我有超过 2,500 个目录可供使用,而且它告诉我哪些目录不是空的,因此清理起来非常容易。谢谢!
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 2021-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多