Automation 是否自动展平某些目录而不是其他目录?

Automation 是否自动展平某些目录而不是其他目录?,automation,directory,flatten,Automation,Directory,Flatten,我有一个目录,里面有几千个子目录(但是这些子目录中没有子目录),我只需要展平一些子目录的内容,所以基本上把这些目录的内容放到根目录中 但是我不能对所有的子目录都这样做,而那些我不能展平的子目录中有多个文件 有没有办法自动做到这一点?Python脚本、perl脚本、bash或其他什么?我真的,真的,真的不想用手来做这件事…类似的东西,在bash中(foo表示要展平的目录): 这也将从foo中删除一个空的子目录 您还可以将其放入shell脚本文件中,并使用$1作为目录名: # Exit it a d

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

但是我不能对所有的子目录都这样做,而那些我不能展平的子目录中有多个文件


有没有办法自动做到这一点?Python脚本、perl脚本、bash或其他什么?我真的,真的,真的不想用手来做这件事…

类似的东西,在
bash
中(
foo
表示要展平的目录):

这也将从
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

您可以将其放入名为
flatte
的文件中,然后运行
sh flatte foo
以展平目录
foo
。或者,
chmod+xflatten
并运行
/flattefoo
。最后,如果您长期使用它,您可以将它移动到我们的
路径中的一个目录
,这样您就可以键入
展平foo
。我在Linux上的主目录中有一个
bin
文件,当我登录时,我把自己想要的工具放在那里,然后我把
~/bin
放在
路径中(在
bash
配置文件中设置)。

一般来说,也许是这样您是否有可编程的标准来确定是否要展平目录?如我所说,如果目录中只有一个文件,则必须展平目录。我不知道这是否是可编程的标准…谢谢你的澄清。您最初的问题陈述中说,“…我无法展平的文件夹中有多个文件”(即,如果文件夹有多个文件,则不会展平),这并不意味着每个文件夹都有一个文件被展平(如果文件夹有一个文件,则会展平)。因此,您的附加注释很有帮助。当我尝试运行该操作时,它似乎试图从整个系统的根目录中删除目录…在我的第一句话中,我说,“$1表示您要展平的目录“。您必须将
$1
设置为所需的目录。如果您将其放入一个shell脚本文件中,比如称为
foo
,那么您可以运行
foomy\u dir
。我对答案进行了编辑,使其非常清晰。好吧,当我现在尝试运行它时,它失败了,因为它似乎无法支持包含多个单词的目录名,相反,会出现一系列错误,如:
ls:This:no-the-file或directory
ls:is:no-the-file或directory
/foo:line 13:[:参数太多了我做了什么蠢事吗?@user2587581,不,你没有做任何蠢事。我忘了引用
$x
的路径名来处理嵌入空间。我已经修改了它。太棒了,它现在工作得很好。唯一奇怪的是,它说一些目录在忽略其他目录时不是空的,而且还有sn完全没有任何模式。但这只发生在7个目录上,我有2500多个目录要处理,而且它告诉我哪些目录不是空的,所以非常容易清理。谢谢!
# 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