сценарий оболочки для передачи имен файлов и выполнения

У меня есть список имен файлов file1, file2, file3
Я хочу передать эти имена файлов в скрипте и удалить специальные символы

Я подготовил команду sed для удаления специальных символов

sed  -i -e 's/^B/,/g' /home/data/nfiledata/ 
hdfs dfs -put -f /home/data/nfiledata/*  user/sai/table1/nfiledata/
gzip  /home/data/nfiledata/*

sed  -i -e 's/^B/,/g' /home/data/marginfile/  
hdfs dfs -put -f /home/data/marginfile/*  user/sai/table2/marginfile/
gzip  /home/data/marginfile/*

sed  -i -e 's/^B/,/g' /home/data/calldata/  
hdfs dfs -put -f /home/data/calldata/*  user/sai/table3/calldata/
gzip  /home/data/calldata/*

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

nfile = (nfiledata,margindata, calldata)
while IFS= read -r nfile
do
  sed  -i -e 's//,/g' /home/data/$nfile/
  hdfs dfs -put -f /home/data/$nfile/*  user/sai/table$/$nfile/
  gzip  /home/data/$nfile/*
done < "home/data/$nfile"
+1
источник поделиться
2 ответа

Ответ для исходной версии вопроса

Та же команда sed может применяться для редактирования нескольких файлов с одним вызовом:

sed  -i -e 's/old/new/g' /home/data/file1 /home/data/file2 /home/data/file3

Кроме того, если имена файлов действительно такие простые, то можно использовать расширение скобки:

sed  -i -e 's/old/new/g' /home/data/file{1..3}

Или,

sed  -i -e 's/old/new/g' /home/data/file[123]

Или, если нет других одинаково названных файлов, которые вы хотите исключить, расширение пути может быть достаточным:

sed  -i -e 's/old/new/g' /home/data/file?

Пример реальных имен файлов

sed  -i -e 's/old/new/g' nfile_dat fileidentifier margindata calldata
+1
источник

Здесь подходит цикл for, а не цикл while read while:

nfile=(file1 file2 file3)
for f in "${nfile[@]}"; do
  sed  -i -e 's/^B/,/g' /home/data/"$f"/ # should this be "$f"/* ?
  hdfs dfs -put -f /home/data/"$f"/*  user/sai/table1/"$f"/
  gzip /home/data/"$f"/*
done

Примечательные компоненты:

  • У заданий не должно быть пробелов вокруг =. Запятые не являются частью синтаксиса массива в bash - unquoted, unescaped whitespace действует как разделитель в этом случае, как и везде.
  • Расширения, такие как $f должны быть внутри двойных кавычек, которые должны выполняться безопасно (без разбиения строк или подстановки).
  • Расширения Glob, такие как *, должны быть за пределами кавычек, которые нужно соблюдать.
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос