Как уникально идентифицировать имя файла? [закрыто]

-1
15.02.2018, 01:43
2 ответа

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, $mailfileserá 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.csva ese prefijo. Si ese nombre resultante corresponde a un archivo existente, entonces sabemos que $mailfilees lo que usted llama un "archivo de correo" y que $physicalfilees el "archivo físico" correspondiente, e imprimimos los dos nombres en mailfiles.txty physicalfiles.txtrespectivamente (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)

2
28.01.2020, 05:07

РЕДАКТИРОВАТЬ :Этот вопрос сильно изменился по сравнению с оригиналом. На данный момент кажется, что вам нужно собрать пары имен файлов для вставки в два выходных файла.

Для этого вы можете использовать функцию вашей оболочки подстановки файлов . Решение файлового шаблона для вашего случая несложно, если вы включите опцию оболочки 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
2
28.01.2020, 05:07

Теги

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