Как избежать обработки переменной, содержащей список каталогов, как строки [closed]

-1
15.12.2018, 23:53
2 ответа

Чтобы обработать каждый каталог в $ path отдельно, вам необходимо перебрать записи в $ path во внешнем цикле:

    path=`grep "^TEST" ${Dir}/Project.txt | cut -d"|" -f3`

    for dir in $path; do
      for f in `ls -Rd "${Dir}${path}"/* -type f | grep ^${file}`; do
        ${f} >"${Dir}${path}"/"${file}"_total_file_list.txt
      done
    done

Однако, поскольку кажется, что цикл обработки также ссылается на имя файла в $ file , которое соответствует каталогу, прочитанному из этой записи, вам также необходимо одновременно выполнить итерацию через $ file в таком же темпе. Более простой способ - обрабатывать каждую строку в Project.txt отдельно:

while read line; do
  IFS='|';
  fields=($line);  # split $line on '|' delimiters
  unset IFS;

  source=${fields[0]}
  file=${fields[1]}
  path=${fields[2]}

  if [ "$source!" != "TEST!" ]
  then
    continue  # skip lines not beginning with "TEST"
  fi

  for f in `ls -Rd "${Dir}${path}"/* -type f | grep ^${file}`
  do
    ${f} >> "${Dir}${path}"/"${file}"_total_file_list.txt
  done

done <Project.txt

Здесь используется разделитель входных полей Bash для разделения каждой записи во входном файле по разделителю ] | .

Наконец, вы не должны анализировать вывод ls . Вы можете перебирать файлы, используя встроенные функции сопоставления шаблонов в bash:

for f in "{Dir}${path}"/**/"$file"*; do
  if [ -f "${f}" ]  # check that $f is a file
  then
    ${f} >> "${Dir}${path}"/"${file}"_total_file_list.txt
  fi
done

Преимущество использования встроенных функций в Bash для анализа входных файлов и каталогов заключается в том, что не требуется вызывать внешние программы, что, вероятно, приведет к более быстрому сценарию. исполнение.

Для дальнейшего чтения эссе Дэвида А. Уилерса о Имена файлов и пути в оболочке: как это сделать правильно предоставляет полезные советы и множество примеров для безопасной и надежной обработки такого рода обработки.

0
28.01.2020, 05:13

используйте двойные кавычки. (проверьте вывод последней команды.)

example

$ ls *.txt
test1.txt  test2.txt  test3.txt  test4.txt  test5.txt

$ files=$(ls *.txt)

$ echo ${files}
test1.txt test2.txt test3.txt test4.txt test5.txt

$ echo "${files}"
test1.txt
test2.txt
test3.txt
test4.txt
test5.txt

так что в вашем случае вам нужно использовать это как это

echo "${path}" | while read dir_path
do
       ls -r "${Dir}${dir_path}"
done

Кроме того, ваша команда find с grep неверна. попробуйте с помощью xargs

find path -type f | xargs grep "pattern"
0
28.01.2020, 05:13

Теги

Похожие вопросы