1

我想在Linux中编写一个shell脚本,循环遍历所有目录和子目录,并对所有文本文件进行一次cat。下面是我到目前为止得到的,我在这个逻辑上有点落后。有人可以帮帮我吗?谢谢

该脚本采用 1 个参数,例如:./script.sh directoryName

#!/bin/bash

echo "Directory $1"

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

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

4

4 回答 4

4

Use find.

If your operating system supports a modern version of POSIX:

find "$1" -type f -name '*.txt' -exec cat '{}' +

...or, if it doesn't:

find "$1" -type f -name '*.txt' -exec cat '{}' ';'

...or, if you want to be inefficient (or have a more interesting use case you haven't told us about), and your find supports -print0...

find "$1" -type f -name '*.txt' -print0 | \
  while IFS='' read -r -d '' filename; do
    cat "$filename"
  done

Don't leave out the -print0 -- otherwise, maliciously-named files (with newlines in their names) can inject arbitrary names into your stream (at worst), or hide from processing (at best).

于 2013-09-30T22:08:47.000 回答
2
find . -name '*.txt' -print0 | xargs -0 cat

如果需要特定目录,请将 替换为目录.的完整路径。find获取以扩展名结尾的文件.txt并将其通过管道传输到在它们上xargs运行命令的cat文件。-0选项xargs按字面意思接受输入。-print0模式适合这个...

于 2013-09-30T22:18:46.653 回答
2

您可以使用find或递归。

使用递归的示例:

dump_files()
{
   for f in $1/*; do
       if [[ -f $f ]]; then
           cat $f
       elif [[ -d $f ]]; then
           dump_files $f
       fi
   done
}
于 2013-09-30T22:10:29.787 回答
0

改变循环

for f in $(find . -name *.txt);do
   cat $f
done
于 2013-09-30T22:12:15.517 回答