Shell-脚本删除 for 循环中的子目录

Shell-script removing subdirectories in a for-loop

下面的小脚本旨在遍历所提供路径的子目录,对这些子目录中的文件执行一些操作,然后删除这些子目录下的所有内容,使子目录完好无损但为空。

#!/bin/sh
basedir=

for subdir in $(find "$basedir" -mindepth 1 -maxdepth 1 -type d); do
    dir=`basename $subdir`

    # Some other code here
    # ...

    echo "Removing subdirectories $subdir/*"
    rm -rfv "$dir/*"
done

例如下面的目录树:

.
├── test1
│   ├── db_1422323507_1421673171_272
│   │   └── rawdata
│   ├── db_1423828548_1423645476_289
│   │   └── rawdata
│   ├── db_1423837057_1423828554_290
│   │   └── rawdata
│   ├── db_1423838029_1423837138_291
│   │   └── rawdata
│   └── db_1424102912_1423838103_292
│       └── rawdata
├── test2
├── test3
│   ├── db_1430478916_1429109291_82
│   │   └── rawdata
│   ├── db_1430517825_1430478932_83
│   │   └── rawdata
│   ├── db_1430518751_1430518207_84
│   │   └── rawdata
│   └── db_1430920306_1430913191_86
│       └── rawdata
├── test4
│   └── db_1436338354_1430920324_100
│       └── rawdata
└── test5

在 运行 脚本之后 ./myscript.sh . 我希望看到以下目录树。

.
├── test1
├── test2
├── test3
├── test4
└── test5

但脚本似乎没有删除任何内容,其他代码 在子目录下的 files/folders 上按预期工作。

怎么样:

    rm -rfv "$subdir/*"

而不是引用 $dir。如果 $basedir 是其中包含目录的路径,我希望这会有所不同,例如像 a/b/c.

此外,尝试从 rm 命令中省略 -f 选项,它可能会打印出一些错误消息,这将帮助您调试问题。

您不应该在此处使用 for 循环遍历 find 的输出,但是 find 也不是必需的。模式中的尾随 / 将防止 subdir 被设置为非目录文件系统条目。另外,不要在 rm.

的参数中引用 *
#!/bin/sh
basedir=

for subdir in "$basedir"/*/; do
    dir=`basename $subdir`

    # Some other code here
    # ...

    echo "Removing subdirectories $subdir/*"
    rm -rfv "$dir/"*
done