Дайте этому сценарию список имен файлов в том порядке, в котором вы хотите установить их время модификации. Они будут расположены в порядке возрастания с интервалом в 1 секунду.
#!/bin/sh
# touch++: run touch to set mod time of file arguments,
# starting at indicated time and increasing by 1 second
# for each argument
# mp, 5/2/2018
usage() {
echo "Usage: $0 -d \"date\" FILE..." >&2
}
while getopts "d:" opt
do
case "$opt" in
d)
date="$OPTARG"
;;
*)
usage
exit 1
;;
esac
done
shift $((OPTIND-1))
if [ -z "$date" ]
then
usage
exit 1
fi
secs=$(date -d "$date" "+%s")
if [ $? != 0 ]
then
usage
exit 2
fi
echo setting times starting at $secs $(date -d "@$secs")
for f
do
touch -m -t $(date -d "@$secs" "+%Y%m%d%H%M.%S") -- "$f"
secs=$((secs + 1))
done
rm -f COUNTRY_??.TXT
for file in COUNTRY_??_*.TXT; do
cat "$file" >>"${file%_*.TXT}.TXT"
done
Во-первых, это гарантирует отсутствие объединенных файлов. Мы всегда будем добавлять к объединенным файлам, поэтому, если такие файлы уже существуют, данные в результирующих файлах могут дублироваться, если код выполняется несколько раз.
Затем мы перебираем файлы. Мы предполагаем, что каждый файл соответствует шаблону COUNTRY_??_*.TXT
(, который, по-видимому, соответствует именам в вопросе ). Для каждого файла мы просто используем cat
, чтобы добавить данные в конец соответствующего объединенного файла. Имя объединенного файла получается путем удаления кратчайшей строки суффикса, соответствующей _*.TXT
, из имени файла, а затем добавления .TXT
обратно в конец.
Проверка:
$ ls
COUNTRY_FR_20100328.TXT COUNTRY_GB_20200410.TXT COUNTRY_US_20200406.TXT
COUNTRY_GB_20200401.TXT COUNTRY_US_20200401.TXT
(здесь запускается цикл)
$ ls
COUNTRY_FR.TXT COUNTRY_GB_20200401.TXT COUNTRY_US_20200401.TXT
COUNTRY_FR_20100328.TXT COUNTRY_GB_20200410.TXT COUNTRY_US_20200406.TXT
COUNTRY_GB.TXT COUNTRY_US.TXT
Каждый новый файл будет конкатенацией соответствующих файлов с датами в именах.
В комментарии добавлены дополнительные требования. :Удалите заголовки из всех файлов, кроме первого объединенного.
rm -f COUNTRY_??.TXT
for file in COUNTRY_??_*.TXT; do
outfile=${file%_*.TXT}.TXT
if [ -s "$outfile" ]; then
sed 1d "$file"
else
cat "$file"
fi >>"$outfile"
done
То есть, если выходной файл существует и имеет размер больше нуля, удалите первую строку из текущего файла с помощью sed
, в противном случае просто используйте cat
, как и раньше.