我想在Linux中编写一个shell脚本,它遍历所有目录和子目录并将所有文本文件包含一次。下面是我到目前为止所得到的,我对这一点的逻辑略微落后。有人可以帮我一把吗?感谢
脚本取1个参数 例如:./ script.sh directoryName
#!/bin/bash
echo "Directory $1"
cd $1
for f in *.txt
do
cat $f
done
我不确定如何从这里进入子目录,因为每个子目录中可以有无限量。
答案 0 :(得分:4)
使用find
。
如果您的操作系统支持现代版本的POSIX:
find "$1" -type f -name '*.txt' -exec cat '{}' +
......或者,如果没有:
find "$1" -type f -name '*.txt' -exec cat '{}' ';'
...或者,如果你想效率低下(或者有一个更有趣的用例你还没有告诉我们),你的find
支持-print0
......
find "$1" -type f -name '*.txt' -print0 | \
while IFS='' read -r -d '' filename; do
cat "$filename"
done
不要遗漏-print0
- 否则,恶意命名的文件(名称中带有换行符)可以在流中注入任意名称(最坏情况下),或者隐藏处理(最好)。
答案 1 :(得分:2)
您可以使用find
或递归。
使用递归的示例:
dump_files()
{
for f in $1/*; do
if [[ -f $f ]]; then
cat $f
elif [[ -d $f ]]; then
dump_files $f
fi
done
}
答案 2 :(得分:2)
find . -name '*.txt' -print0 | xargs -0 cat
如果您需要特定目录,请将.
替换为目录的完整路径。 find
获取以扩展名.txt
结尾的文件,并将其传递给xargs
,并在其上运行命令cat
。 -0
选项xargs
从字面上理解输入。 -print0
模式适用于此...
答案 3 :(得分:0)
用
改变循环for f in $(find . -name *.txt);do
cat $f
done