如何删除每个只包含一个文件夹的中间文件夹?

时间:2015-09-12 12:45:13

标签: bash file shell recursion mv

我一直在玩mv,现在我有一个情况。 早些时候,说 Folder1有file1,2,3。

现在Folder1有Folder2,其Folder3包含Folder4,其中包含file1,2,3。

我正在尝试编写一个bash脚本,以便识别仅包含1个目录的中间文件夹,并将其所有内容上移一级,最终只返回Folder1-> file1,2,3,并删除其余文件夹。 / p>

我试着写下面的内容,但我是:

1.无法区分文件和文件夹

2.无法找到存储在当前文件夹中的文件/目录名

3.不确定如何递归。

#!/bin/bash

echo "Directory Name?"
read dir_name

no_files=`ls -A| wc -l`

if [ $no_file==1 ] && [ itisaDirectory()];
then `mv folder_name/* dir_name`
fi

1 个答案:

答案 0 :(得分:0)

当您不关心错误消息并希望将子目录中的所有文件移动到当前目录并删除剩余的空目录时,请执行类似

的操作
find . -type f -exec mv {} "${dir_name}" \; 2>/dev/null
rm -r */

您要求其他内容,只移动中间目录唯一的文件。如果只有一个子目录具有该dir作为父级,则就是这种情况。可以使用dirname找到目录的父级。 当一个目录有一个子目录时,只有一个子目录将它作为父目录。您可以列出所有目录,查找父目录并选择唯一路径。

find . -type d  -exec dirname {} \; | sort | uniq -u | while read dir; do
   echo "${dir} has exactly one subdir"
done

问题是dir也可以有文件。我们尝试改进上述解决方案:

find . -exec dirname {} \; | sort | uniq -u | while read dir; do
   echo "${dir} has exactly one subdir or one file"
done

您可以使用if [ -d "${dir}/*" ]测试目录的内容,但我不需要知道:

find . -exec dirname {} \; | sort | uniq -u | while read dir; do
   echo "${dir} has exactly one subdir or one file"
   find "${dir}"/*/ -type f -exec mv {} "${dir_name}" \; 2>/dev/null
done

路径$ {dir} / * /仅在$ {dir}中有子目录时存在,并将文件移到下面。当$ dir只有一个文件时,find命令将找不到任何内容。