2
#!/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

我有上面的代码来遍历目录和子目录并列出所有文件。我收到错误消息:意外标记 `then' 附近的语法错误

我在这里做错了什么?

4

3 回答 3

7
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.

于 2013-08-21T14:21:01.327 回答
4

作为替代方案,您可能可以用类似的东西替换整个循环

# find all files either in /data or /data/subdir
find  /data -type f -maxdepth 2 | while read file; do
  echo $file;
end
于 2013-08-21T14:24:14.343 回答
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"
于 2014-07-15T02:12:02.907 回答