Bash脚本帮助,包括用于处理文件的子目录

时间:2011-01-22 05:15:58

标签: linux bash shell unix

我绝对是脚本新手。我有一个处理某些文件的脚本,我无法弄清楚如何针对包含许多子目录和数千个文件的目录中的所有文件运行此脚本。基本上我想采用这个脚本并针对标题为2011的目录运行它并让它处理每个子文件夹中的每个文件。

#!/bin/bash
FILES=./userfiles/*
for f in $FILES
do
    echo ""
    echo ""
    echo "Processing File $f ...."
    echo ""
    echo ""
    make FILE_TYPE=user CSS_PATH=./log.css SCRIPT_PATH=./toggle.js SAXON_JAR=/opt/saxon/saxon9he.jar $f.html
    echo ""
    echo ""
    echo "File $f.html Generated"
done

5 个答案:

答案 0 :(得分:1)

以下脚本将递归到./userfiles下的每个目录中并处理其中的所有文件,即使名称中包含空格(或其他恶意字符)的文件也是如此。

此外,您编写脚本的方式, make 将作为其最后一个参数传递,因为它显示在附加.html的磁盘上。例如,文件./userfiles/subdir/foobar.txt将作为./userfiles/subdir/foobar.txt.html传递给 make 。如果这不是您想要的,请相应地调整${file}.html

此外,如果您希望find 处理以.html结尾的文件,那么您可以将选项-name "*.html"附加到路径名后面的任何地方都有find命令。

#!/bin/bash

topLevelDir="./userfiles"

while IFS= read -r -d $'\0' file; do
    echo 
    echo 
    echo "Processing File $file ...."
    echo 
    echo 
    make FILE_TYPE=user CSS_PATH=./log.css SCRIPT_PATH=./toggle.js SAXON_JAR=/opt/saxon/saxon9he.jar "${file}".html
    echo  
    echo  
    echo "File $file.html Generated"
done < <(find "$topLevelDir" -type f -print0)

答案 1 :(得分:0)

尝试使用find命令获取所有文件和目录的列表

答案 2 :(得分:0)

不确定您的脚本是做什么的,但是为了从当前文件夹开始的树中的每个文件运行它,您可以使用:

find . -exec yourscript.sh {} \;

答案 3 :(得分:0)

由于您的脚本已经了解了一个级别的文件扩展,因此可能在包含./userfiles目录的每个目录上运行它会很快且简单...

$ find . -type d -a -name userfiles -a -exec sh /whatever/myscript {}/.. \;

答案 4 :(得分:0)

这是一个执行你所要求的功能,你传递一个文件夹,看到底部func_process_folder_set&#34; /文件夹&#34;的调用。

    # --- -------------------------------- --- #
    # FUNC:  Process a folder of files
    # --- -------------------------------- --- #
    func_process_folder_set(){

        FOLDER="${1}"

        while read -rd $'\0' file; do

            fileext=${file##*.}  # -- get the .ext of file
            case ${fileext,,}    # -- make ext lowercase for checking in case statement
            echo "FILE: $file"   # -- print the file  (always use " " to handle file spaces)

        done < <(find  ${FOLDER} -type f -maxdepth 20 -name '*.*' -print0)

    }

    # -- call the function above with this:
    func_process_folder_set "/some/folder"