Необычное поведение для цикла с командой Find с использованием ksh - PullRequest
0 голосов
/ 24 октября 2018

Я наблюдаю очень странное поведение в моем скрипте 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.

Процесс проверяет, что в двух файлах есть «abc», а в двух других - «def».

Процесс создает файл project_1.batch, содержащий именадва файла в двух отдельных строках.

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

Аналогично, процесс создает пакет project_2.bat, содержащий имена двух других файлов в двух отдельных строках.

Далее я зацикливаюсь на двух .batch файлах, и он работает как положено.Цикл for выбирает по одному .batch-файлу за раз и продолжает ...

for bf in `find $dataindir -maxdepth 1 -type f -name "*.batch" | sort -n`
    do
      echo $bf
      #intermediate process
    done

Однако я повторяю файлы .batch второй раз в отдельном цикле for, используята же команда (но с использованием другой переменной for) и на этот раз результаты странные!Цикл 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

Впоследствии, когда я пытаюсь запустить cat на $ ef внутри цикла for, я получаю сообщение об ошибке

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

^^^^ Обратите внимание, что между двумя именами файлов включен символ новой строки.

Почему цикл for с командой find работает один раз, а другой - нет?В конце концов мне нужно использовать следующее, чтобы скрипт работал, но почему команда find не работает так же, как в прошлый раз?!

for file in $dataindir/project_*.batch

1 Ответ

0 голосов
/ 26 октября 2018

Это происходит, когда вы изменяете 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циклы над расширениями команд и чтение строк, разделенных NUL или переводом строки, вместо цикла while read.

...