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

Linux Bash脚本帮助,包括用于处理文件的子目录,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我绝对是个新手。我有一个处理一些文件的脚本,但我不知道如何在一个有许多子目录和数千个文件的目录中对所有文件运行这个脚本。基本上,我想让这个脚本在一个名为2011的目录下运行,让它处理每个子文件夹中的每个文件 #!/bin/bash FILES=./userfiles/* for f in $FILES do echo "" echo "" echo "Processing File $f ...." echo "" echo "" make FIL

我绝对是个新手。我有一个处理一些文件的脚本,但我不知道如何在一个有许多子目录和数千个文件的目录中对所有文件运行这个脚本。基本上,我想让这个脚本在一个名为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

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

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

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

find . -exec yourscript.sh {} \;

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

find . -exec yourscript.sh {} \;

因为您的脚本已经理解了一个级别的文件扩展,所以在包含
/userfiles
目录的每个目录上运行它可能会快速而简单

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

因为您的脚本已经理解了一个级别的文件扩展,所以在包含
/userfiles
目录的每个目录上运行它可能会快速而简单

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

下面的脚本将递归到
/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)
#/bin/bash
topLevelDir=“./userfiles”
而IFS=read-r-d$'\0'文件;做
回音
回音
echo“正在处理文件$File…”
回音
回音
使文件类型=用户CSS\u路径=./log.CSS脚本路径=./toggle.js SAXON\u JAR=/opt/SAXON/saxon9he.JAR“${FILE}”.html
回音
回音
echo“生成文件$File.html”

完成<以下脚本将递归到
/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)
#/bin/bash
topLevelDir=“./userfiles”
而IFS=read-r-d$'\0'文件;做
回音
回音
echo“正在处理文件$File…”
回音
回音
使文件类型=用户CSS\u路径=./log.CSS脚本路径=./toggle.js SAXON\u JAR=/opt/SAXON/saxon9he.JAR“${FILE}”.html
回音
回音
echo“生成文件$File.html”

完成<这里有一个函数,它可以满足您的要求,您可以将一个文件夹传递给它。请参见底部的调用func\u process\u folder\u set”/folder

#-------------------------------------------#
#FUNC:处理文件夹中的文件
# --- -------------------------------- --- #
func_进程_文件夹_集合(){
FOLDER=“${1}”
读取-rd$'\0'文件时;执行以下操作
fileext=${file}.*.}--获取文件的.ext
case${fileext,,}#——使ext小写以检查case语句
echo“FILE:$FILE”#——打印文件(始终使用“”处理文件空间)

完成<这里有一个函数,它可以满足您的要求,您可以将一个文件夹传递给它。请参见底部的调用func\u process\u folder\u set”/folder

#-------------------------------------------#
#FUNC:处理文件夹中的文件
# --- -------------------------------- --- #
func_进程_文件夹_集合(){
FOLDER=“${1}”
读取-rd$'\0'文件时;执行以下操作
fileext=${file}.*.}--获取文件的.ext
case${fileext,,}#——使ext小写以检查case语句
echo“FILE:$FILE”#——打印文件(始终使用“”处理文件空间)

完成了
read
命令的所有保护后,我很确定
find
需要一个
print0
。顺便说一句,你可以做
-d'
。@Dennis heh crap。谢谢你指出这个疏忽。我不知道
-d'
是等效的,但我想我稍微喜欢更明确的一点etter.嗨,谢谢,这很有帮助。我想做的是让脚本在一个名为2011的目录上运行,然后让它在该目录下的每个子目录和每个文件上运行。嗨,我尝试了,上面的脚本,但我在下面粘贴了一个错误。我将我提到的整个“2011”目录复制到一个名为“userfiles”的文件夹中然后从我有“makefile”的文件夹中运行脚本还有我最初粘贴的脚本运行时需要的其他组件。@用户,你确定你复制的脚本正确吗?看起来你有
le IFS=…
而不是
,而IFS=…
read
命令上有所有保护,我很确定
find
需要一个
print0
结束。顺便说一句,你可以做
-d'
。@Dennis嘿,废话。谢谢你指出这个疏忽。我不知道