Puede iterar sobre un patrón que coincida con el primer tipo de archivo y seleccionar el segundo tipo de archivo modificando cada uno de esos nombres:
#!/bin/sh
rm -f mailfiles.txt
rm -f physicalfiles.txt
for mailfile in s_4800_agency_addresses_*_standard_error.csv; do
prefix=${mailfile%_standard_error.csv}
physicalfile="${prefix}_1_standard_error.csv"
if [ -f "$physicalfile" ]; then
printf '%s\n' "$mailfile" >>mailfiles.txt
printf '%s\n' "$physicalfile" >>physicalfiles.txt
fi
done
En cada iteración del bucle anterior, $mailfile
será un nombre de archivo del directorio actual que coincida con el patrón s_4800_agency_addresses_*_standard_error.csv
, por ejemplo, cualquiera de los dos nombres de archivo que menciona.
A partir de esto, seleccionamos el prefijo, que es todo menos el final _standard_error.csv
, y construimos un nuevo nombre de archivo agregando _1_standard_error.csv
a ese prefijo. Si ese nombre resultante corresponde a un archivo existente, entonces sabemos que $mailfile
es lo que usted llama un "archivo de correo" y que $physicalfile
es el "archivo físico" correspondiente, e imprimimos los dos nombres en mailfiles.txt
y physicalfiles.txt
respectivamente (estos archivos de resultados se eliminan inicialmente ).
Si no hay ningún archivo correspondiente al nombre de archivo recién construido, entonces hemos llegado a uno de los "archivos físicos" (o un "archivo de correo" sin un "archivo físico" correspondiente )y se ignora.
Ejecutando esto:
$ ls -1
s_4800_agency_addresses_1_10_2018_14_13_1_standard_error.csv
s_4800_agency_addresses_1_10_2018_14_13_standard_error.csv
(el script se ejecuta aquí)
$ ls -1
mailfiles.txt
physicalfiles.txt
s_4800_agency_addresses_1_10_2018_14_13_1_standard_error.csv
s_4800_agency_addresses_1_10_2018_14_13_standard_error.csv
$ cat mailfiles.txt
s_4800_agency_addresses_1_10_2018_14_13_standard_error.csv
$ cat physicalfiles.txt
s_4800_agency_addresses_1_10_2018_14_13_1_standard_error.csv
(líneas en blanco añadidas para mejorar la legibilidad)
РЕДАКТИРОВАТЬ :Этот вопрос сильно изменился по сравнению с оригиналом. На данный момент кажется, что вам нужно собрать пары имен файлов для вставки в два выходных файла.
Для этого вы можете использовать функцию вашей оболочки подстановки файлов . Решение файлового шаблона для вашего случая несложно, если вы включите опцию оболочки extglob
и если ваш формат файла для минутного элемента вашей метки времени всегда состоит из двух цифр. В этом случае попробуйте:
for physical in *_addresses_+([0-9_])_1_standard_error.csv ; do
mailing=${physical/_1_s/_s}
# Do your own thing, but for testing...
printf "Pair:\n %s\n %s\n" "$mailing" "$physical"
done
Теперь, что касается следующей части вашего требования, вы, кажется, хотите поместить имена каждой пары файлов в какие-то третий и четвертый выходные файлы. Для этого вы можете использовать либо printf
, если вам нужен простой выходной список, либо sed
для более сложных вставок.
Для первого (простого )случая:
for physical in *_addresses_+([0-9_])_1_standard_error.csv ; do
mailing=${physical/_1_s/_s}
printf "%s\n" "$mailing" >> path/to/your_mailing_list.txt
printf "%s\n" "$physical" >> path/to/your_physical_list.txt
done
Во втором, более сложном случае, подготовьте каждый выходной файл шаблона с двумя гарантированно уникальными строками, одной для $physical
и одной для $mailing
, а затем используйте sed
, чтобы заменить эти строки именами файлов. В дальнейшем я выбрал уникальные строки @physical
и @mailing
, файлы шаблонов называются physical_template.txt
и mailing_template.txt
, а окончательные результаты будут файлами с уникальными именами в формеresult_{$physical or $mailing}.txt:
for physical in *_addresses_+([0-9_])_1_standard_error.csv ; do
mailing=${physical/_1_s/_s}
sed "s/@physical/$physical/g" physical_template.txt > result_$physical.txt
sed "s/@mailing/$mailing/g" mailing_template.txt > result_$mailing.txt
done