Mac中将子目录中的所有内容移动到第一层目录中的命令

6个月前 / Directory:MAC / Views:119

1.打开终端。
2.导航到“室内灯具模型”文件夹:
cd /Users/your_username/Desktop/文件夹

运行以下脚本:

    for dir in */; do
        if [ -d "$dir" ]; then
            inner_dir=$(find "$dir" -mindepth 1 -maxdepth 1 -type d)
            if [ -n "$inner_dir" ]; then
                inner_dir_name=$(basename "$inner_dir")
                mv "$inner_dir"/* "$dir"
                mv "$dir/$inner_dir_name" .
            fi
            rmdir "$dir"
        fi
    done


解释:
inner_dir_name=$(basename “$inner_dir”): 获取子目录的名称。
mv “$inner_dir”/* “$dir”: 将子目录中的所有内容移动到第一层目录中。
mv “$dir/$inner_dir_name” .: 将空的子目录从第一层目录移到“室内灯具模型”文件夹。
rmdir “$dir”: 删除第一层目录。
这个脚本将所有的内容移到父目录,并删除已为空的第一层目录。请务必在操作前备份数据,以防意外丢失。
需要确保第一层目录保留,只删除第二层的“同名”子目录。下面是一个更准确的脚本来满足你的需求:

for dir in */; do
    if [ -d "$dir" ]; then
        inner_dir=$(find "$dir" -mindepth 1 -maxdepth 1 -type d)
        for sub_dir in $inner_dir; do
            if [ -n "$sub_dir" ]; then
                mv "$sub_dir"/* "$dir"
                rmdir "$sub_dir"  # 删除已经变成空的第二层目录
            fi
        done
    fi
done


如果脚本没有按照预期删除第二层目录,我们可以先确保所有内容成功移到第一层之后,再专门运行一个命令来删除所有空目录。

# 第一步:把第二层目录中的所有内容移动到第一层目录

for dir in */; do
    if [ -d "$dir" ]; then
        inner_dirs=$(find "$dir" -mindepth 1 -maxdepth 1 -type d)
        for sub_dir in $inner_dirs; do
            if [ -n "$sub_dir" ]; then
                mv "$sub_dir"/* "$dir"
            fi
        done
    fi
done



# 第二步:删除所有空的第二层目录
find . -mindepth 2 -type d -empty -exec rmdir {} \;
有时候可能会遇到空白目录中含有隐藏的隐藏文件(例如 .DS_Store),导致无法删除空白目录,可以用以下方法:

# 第一步:把第二层目录中的所有内容移动到第一层目录

for dir in */; do
    if [ -d "$dir" ]; then
        inner_dirs=$(find "$dir" -mindepth 1 -maxdepth 1 -type d)
        for sub_dir in $inner_dirs; do
            if [ -d "$sub_dir" ]; then
                mv "$sub_dir"/* "$dir"
            fi
        done
    fi
done



# 第二步:删除所有隐藏文件,例如 .DS_Store
find . -type f -name '.*' -delete

# 第三步:反复删除所有空的目录,无论层级,直到没有更多的空目录

while true; do
    empty_dirs=$(find . -type d -empty -print)
    if [ -z "$empty_dirs" ]; then
        echo "所有空目录均已删除"
        break
    else
        echo "删除以下空目录:"
        echo "$empty_dirs"
        echo "$empty_dirs" | xargs rmdir
    fi
done

经过测试,这步是可以的,它的流程是:
1.先将第二层内容移动到第一层
2.删除所有隐藏的文件,包含.DS_Store
3.删除空白目录