Linux Shell脚本文件和目录循环

时间:2013-09-30 22:06:34

标签: linux shell loops directory

我想在Linux中编写一个shell脚本,它遍历所有目录和子目录并将所有文本文件包含一次。下面是我到目前为止所得到的,我对这一点的逻辑略微落后。有人可以帮我一把吗?感谢

脚本取1个参数 例如:./ script.sh directoryName

#!/bin/bash

echo "Directory $1"

cd $1
for f in *.txt
do
cat $f
done

我不确定如何从这里进入子目录,因为每个子目录中可以有无限量。

4 个答案:

答案 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