Чтобы обработать каждый каталог в $ 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 для анализа входных файлов и каталогов заключается в том, что не требуется вызывать внешние программы, что, вероятно, приведет к более быстрому сценарию. исполнение.
Для дальнейшего чтения эссе Дэвида А. Уилерса о Имена файлов и пути в оболочке: как это сделать правильно предоставляет полезные советы и множество примеров для безопасной и надежной обработки такого рода обработки.
используйте двойные кавычки. (проверьте вывод последней команды.)
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"