linux - 使用 ksh 使用 Find 命令进行循环的异常行为

标签 linux shell for-loop find ksh

我在我的 KSH 脚本中观察到一个非常奇怪的行为,我无法找出其背后的原因。我希望有人可以对此做出解释!

脚本流程:

  1. 遍历目录中的文件以创建用于批量处理输入文件的批处理文件。例如:输入文件

    sample_abc_20180910.txt
    sample_abc_20180911.txt
    
    sample_def_20180910.txt
    sample_def_20180911.txt;
    

脚本使用以下命令遍历文件:

for f in `find $dataindir -maxdepth 1 -type f -name "sample_*.txt" | sort -n`   

这个 for 循环按预期工作 - 它一次选取一个文件并继续执行 for 循环。

  1. 进程检查两个文件中是否包含“abc”,另外两个文件中是否包含“def”。

  2. Process 创建 project_1.batch,在两个单独的行中包含两个文件的名称。

    $cat project_1.batch
    $sample_abc_20180910.txt
    $sample_abc_20180911.txt
    

类似地,进程创建 project_2.batch,其中在两行中包含其他两个文件的名称。

  1. 接下来我遍历这两个 .batch 文件并按预期运行。 for 循环一次选取一个 .batch 文件并继续...

    for bf in `find $dataindir -maxdepth 1 -type f -name "*.batch" | sort -n`
        do
          echo $bf
          #intermediate process
        done
    
  2. 但是,我在单独的 for 循环中使用相同的命令(但使用不同的 for 循环变量)第二次迭代 .batch 文件,这一次的结果很奇怪! for 循环一次性获取两个 .batch 文件!

    for ef in `find $dataindir -maxdepth 1 -type f -name "*.batch" | sort -n`
        do
          echo $ef
          #intermediate process
        done
    
    $/home/userdir/project/project_2.batch
    $/home/userdir/project/project_1.batch
    

随后,当我尝试在 for 循环内的 $ef 上运行 cat 时,出现错误

cat: /home/userdir/project/project_2.batch
/home/userdir/project/project_1.batch: No such file or directory

^^^^ 注意两个文件名之间包含换行符。

为什么带有 find 命令的 for 循环一次有效,而另一次无效?我最终不得不使用以下命令使脚本工作,但为什么 find 命令不能像上次那样工作?!

for file in $dataindir/project_*.batch

最佳答案

当您修改 IFS 时会发生这种情况,内部字段分隔符决定将未加引号的命令扩展拆分为哪些字符:

$ grep '' *
hello.txt:hello
world.txt:world

$ for f in `find . -name '*.txt'`; do cat "$f"; done
hello
world

$ IFS=':'
(no output)

$ for f in `find . -name '*.txt'`; do cat "$f"; done
cat: ./hello.txt
./world.txt: No such file or directory

这就是为什么您应该避免在命令扩展上使用 for 循环,而是使用 while read 循环读取 NUL 或换行符分隔的条目的几个原因之一。

关于linux - 使用 ksh 使用 Find 命令进行循环的异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52969329/

相关文章:

linux - Linux 上缺少标准库?

android - 如何通过 shell 命令启用 Android 网络共享?

java - 无法运行 Shell 脚本来启动 Jar

java - 我尝试运行这段代码,它运行时不会抛出错误,问题是它不会执行 for 循环我只是一个初学者,所以请

java - mysqldump(错误代码 : 2) trying do backup from java in linux (server) with wildfly

javascript - 监视目录并尽快处理完整的新文件

html - 如何使用 shell 脚本替换 html 注释

linux - 查找和替换函数而不修改参数/变量

PHP - 向我解释这个 while/for 循环

c++ - 从 C++ 循环写入 .mat 文件