用于展平嵌套目录的脚本

用于展平嵌套目录的脚本

我发现 Bruno 的这个脚本可以扁平化目录。有人可以告诉我如何修改它以将其作为循环运行,以便它可以在指定(更高级别)目录中的所有目录上工作吗?
先感谢您 ;)

# This scripts flattens the file directory
# Run this script with a folder as parameter:
# $ path/to/script path/to/folder

#!/bin/bash

rmEmptyDirs(){
    local DIR="$1"
    for dir in "$DIR"/*/
    do
        [ -d "${dir}" ] || continue # if not a directory, skip
        dir=${dir%*/}
        if [ "$(ls -A "$dir")" ]; then
            rmEmptyDirs "$dir"
        else
            rmdir "$dir"
        fi
    done }

flattenDir(){
    local DIR="$1"
    find "$DIR" -mindepth 2 -type f -exec mv -i '{}' "$DIR" ';' }

flattenDir "$1" rmEmptyDirs "$1" echo "Done"

答案1

只需一行即可将所有文件(在子子目录中)移动到 pwd。

$ find  . -mindepth 2 -type f -exec mv {} .. \;

这将移动所有常规文件,包括点文件(以点开头),但不移动链接。

然后,删除空目录:

$ find . -type d -empty -delete

遗漏的内容包含未移动的链接(或其他类型的文件)。

如果您想要脚本,请使用:

#!/bin/bash

fullpath=${1:-.}

( cd "$fullpath";
  find  . -mindepth 2 -type f -exec mv {} .. \;
  find . -type d -empty -delete
)

将脚本调用为:script /the/path/you.want

答案2

对给定目录中找到的所有目录执行特定操作的一种方法是

setopt -s nullglob
for e in SPECIFIED_DIRECTORY/*
do
  setopt -u nullglob
  [[ -d $e ]] && YOUR_SCRIPT "$e"
done

请注意,这将跳过名称以点开头的目录。这通常是我们想要的,但如果您也想包含这些目录,您也可以根据这种情况调整我的解决方案:请参阅dotglob手册页中的选项,并且不要忘记排除特殊目录....

另一种可能性是使用类似的东西

find SPECIFIED_DIRECTORY -maxdepth 1 -type d -exec YOUR_SCRIPT {} \;

相关内容