我需要递归地遍历一个目录,并删除所有扩展名为.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 (bash)的例子:

#!/bin/bash

# loop & print a folder recusively,
print_folder_recurse() {
    for i in "$1"/*;do
        if [ -d "$i" ];then
            echo "dir: $i"
            print_folder_recurse "$i"
        elif [ -f "$i" ]; then
            echo "file: $i"
        fi
    done
}


# try get path from param
path=""
if [ -d "$1" ]; then
    path=$1;
else
    path="/tmp"
fi

echo "base path: $path"
print_folder_recurse $path

其他回答

只做

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

没有找到:

for f in /tmp/* tmp/**/* ; do
  ...
done;

“/tmp/*”为目录下的文件,“/tmp/**/*”为子目录下的文件。有可能您必须启用globstar选项(shop -s globstar)。 所以对于这个问题,代码应该是这样的:

shopt -s globstar
for f in /tmp/*.pdf /tmp/*.doc tmp/**/*.pdf tmp/**/*.doc ; do
  rm "$f"
done

请注意,这要求bash≥4.0(或zsh不带shopt -s globstar,或ksh带set -o globstar而不是shopt -s globstar)。此外,在bash <4.3中,这将遍历到目录和目录的符号链接,这通常是不可取的。

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

**使此工作递归地进行

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

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

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

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

下面是一个使用shell (bash)的例子:

#!/bin/bash

# loop & print a folder recusively,
print_folder_recurse() {
    for i in "$1"/*;do
        if [ -d "$i" ];then
            echo "dir: $i"
            print_folder_recurse "$i"
        elif [ -f "$i" ]; then
            echo "file: $i"
        fi
    done
}


# try get path from param
path=""
if [ -d "$1" ]; then
    path=$1;
else
    path="/tmp"
fi

echo "base path: $path"
print_folder_recurse $path