我要求脚本cd
到一个目录,然后删除子目录中除了几个文件之外的所有文件 - 但保留文件夹。将switch
/ case
用于我需要保留的每个文件会有帮助吗?
理想情况下,我认为它应该继续搜索更多的子目录,而不是我有嵌套循环,只搜索两个级别。
另一个问题是它会跳过带空格的文件夹(虽然现在这不是脚本运行的卷的问题)。
这是我的代码:
for i in /Users/YourName/Desktop/Test/* ; do
if [ -d "$i" ]; then
cd $i
for j in "$i"/* ; do
if [ -d "$j" ]; then
cd $j
for k in $(ls *); do
if [ ! $k == "watch.log" ]; then
echo $k
rm -rf $k
fi
done
fi
done
fi
done
答案 0 :(得分:27)
您应该使用find
:
for i in $(find . -type d)
do
do_stuff "$i"
done
如果你真的有很多目录,你可以将find的输出传递给while read
循环,但是当循环在另一个进程中时,它会使编码变得更难。
关于空格,请务必引用包含目录名称的变量。这应该允许您处理名称中包含空格的目录。
答案 1 :(得分:12)
这个怎么样?
$ find /Users/YourName/Desktop/Test -type f -maxdepth 2 -not -name watch.log -delete
-type
:仅查找文件-maxdepth
:最多两级-not -name
(组合):从搜索中排除watch.log
-delete
:删除文件
首先尝试不带-delete
标志的上述命令。这将打印出已删除的文件列表。
如果您对列表感到满意,请将-delete
添加回命令。
答案 2 :(得分:2)
使用find?您可以使用多个参数,包括深度,文件年龄(如stat),烫发等......
find . -maxdepth 2