脚本遍历目录和子目录以列出文件

时间:2013-08-21 14:19:42

标签: linux bash subdirectory

#!/bin/bash
#script to loop through directories to merge files

mydir=/data/
files="/data/*"

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

我有上面的代码来浏览目录和子目录并列出所有文件。我收到错误:语法错误接近意外令牌`然后'

我在这里做错了什么?

3 个答案:

答案 0 :(得分:6)

if [ -d "$f" ]
  ^

if[之间需要有空格。如果你没有空格,bash认为你正在尝试执行一个名为if[的命令。


files="/data/*"
for f in $files

也知道这不行。要在需要使用数组的变量中存储通配符扩展。语法有点毛茸茸......

files=(/data/*)
for f in "${files[@]}"

或者您可以像使用内循环一样内联编写通配符。那会很好。

for f in "$mydir"/*

对于它的价值,您可以使用find递归递归所有文件和子目录。

find /data/ -type f -print0 | while read -d $'\0' file; do
    echo "Processing $file"
done

-type f仅匹配文件。 -print0结合-d $'\0'是一种额外注意包含空格,制表符甚至换行符等字符的文件名的方法。将这些字符放在文件名中是合法的,所以我喜欢以能够处理它们的方式编写脚本。

请注意,这将比仅仅子目录更深入。它会一路走下去。如果那不是您想要的,请添加-maxdepth 2

答案 1 :(得分:3)

作为替代方案,您可以用

之类的东西替换整个循环
# find all files either in /data or /data/subdir
find  /data -type f -maxdepth 2 | while read file; do
  echo $file;
end

答案 2 :(得分:0)

这是一个执行你要求的功能,你传递一个文件夹,看看底部func_process_folder_set“/ folder”的调用。

    # --- -------------------------------- --- #
    # 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"