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

时间:2015-08-17 15:59:42

标签: sh

下面的小脚本用于循环提供的路径的子目录,对这些子目录中的文件执行某些操作,然后删除这些子目录下的所有内容,使子目录保持不变但为空。

#!/bin/sh
basedir=$1

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

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

2 个答案:

答案 0 :(得分:1)

您不应在此处使用for循环迭代find的输出,但也不需要find。模式中的尾随/将阻止subdir设置为非目录文件系统条目。另外,请勿在{{1​​}}的参数中引用*

rm

答案 1 :(得分:0)

怎么样:

    rm -rfv "$subdir/*"

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

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