#!/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”附近出现语法错误
我在这里做错了什么?
最佳答案
if [ -d "$f" ]
^
if
和[
之间需要有一个空格。如果您没有空格,bash 认为您正在尝试执行名为 if[
.
files="/data/*"
for f in $files
也知道这是行不通的。要在这样的变量中存储通配符扩展,您需要使用数组。语法有点毛茸茸...
files=(/data/*)
for f in "${files[@]}"
或者您可以按照处理内部循环的方式内联编写通配符。那会很好。
for f in "$mydir"/*
就其值(value)而言,您可以使用 find
递归地遍历所有文件和子目录。
find /data/ -type f -print0 | while read -d $'\0' file; do
echo "Processing $file"
done
-type f
只匹配文件。 -print0
与 -d $'\0'
相结合是一种特别小心包含空格、制表符甚至换行符等字符的文件名的方法。在文件名中包含这些字符是合法的,因此我喜欢以能够处理它们的方式编写我的脚本。
请注意,这将递归到比子目录更深的层次。它会一直下降。如果这不是您想要的,请添加 -maxdepth 2
。
关于linux - 遍历目录和子目录以列出文件的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18360000/