我需要递归地遍历一个目录,并删除所有扩展名为.pdf和.doc的文件。我设法递归地循环通过一个目录,但不设法过滤与上述文件扩展名的文件。

我目前的代码

#/bin/sh

SEARCH_FOLDER="/tmp/*"

for f in $SEARCH_FOLDER
do
    if [ -d "$f" ]
    then
        for ff in $f/*
        do      
            echo "Processing $ff"
        done
    else
        echo "Processing file $f"
    fi
done

我需要帮助来完成代码,因为我没有得到任何地方。


当前回答

如果可以更改用于运行该命令的shell,则可以使用ZSH来完成该工作。

#!/usr/bin/zsh

for file in /tmp/**/*
do
    echo $file
done

这将递归循环遍历所有文件/文件夹。

其他回答

只做

find . -name '*.pdf'|xargs rm

这是我所知道的最简单的方法: rm * * / @ (* . doc | * . pdf)

**使此工作递归地进行

@(*.doc|*.pdf)查找以pdf或doc结尾的文件

通过将rm替换为ls,可以轻松安全地进行测试

对于bash(自版本4.0起):

shopt -s globstar nullglob dotglob
echo **/*".ext"

这是所有。 拖尾扩展”。在这里选择具有该扩展名的文件(或dirs)。

选项globstar激活**(递归搜索)。 选项nullglob在不匹配文件/dir时删除*。 选项dotglob包含以点开始的文件(隐藏文件)。

注意,在bash 4.3之前,**/也会遍历到目录的符号链接,这是不可取的。

这并不能直接回答你的问题,但是你可以用一句话来解决你的问题:

find /tmp \( -name "*.pdf" -o -name "*.doc" \) -type f -exec rm {} +

一些版本的find (GNU, BSD)有一个-delete操作,你可以使用它来代替调用rm:

find /tmp \( -name "*.pdf" -o -name "*.doc" \) -type f -delete

下面的代码将递归地遍历给定目录并列出所有内容:

for d in /home/ubuntu/*; 
do 
    echo "listing contents of dir: $d"; 
    ls -l $d/; 
done