#!/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
我有上面的代码来浏览目录和子目录并列出所有文件。我收到错误:语法错误接近意外令牌`然后'
我在这里做错了什么?
答案 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"