Скопируйте файл, содержащий дату в имени файла, в папку для этой даты

Я использовал команду awk. моя проблема заключалась в том, что каждая строка отличается от других. Поэтому я понятия не имел о номерах столбцов; Я решил это, добавив тест, чтобы найти правильный номер строки для отображения. Вот мой код:

awk ' 
BEGIN {
  # Set awk script delimiter
  FS=","; 
  # Set CSV file separator
  OFS=";"; 
  # Set header part in csv file
  print "Method; UserId; ClientId; intent; time"
  } 
  /'clientId'/ 
  { 
    i=1; 
    msg=""; 
    while(i<=NF) { 
      if ($i ~ /clientId/) { 
        # Cleaning column value :
        gsub(/\\n\s{1,}clientId:\s/, "",$i); 
        msg = msg $i ";"
      };  
      if ($i ~ /"time"/) { 
        # Cleaning column value :
        gsub(/"time":/, "",$i); 
        msg = msg $i ";"
      }; 
      if ($i ~ /intent/) { 
        # Cleaning column value :
        gsub(/\\n\s{1,}intent:\s{1,}/, "",$i); 
        msg = msg $i ";"
      }; 
      if ($i ~ /Method/) { 
        # Cleaning column value :
        gsub(/(^(.*?)|\s{1,})Method\s{1,}?:?\s{1,}/, "",$i); 
        gsub (/(\s{1,}\{\s{1,}userId.*)?/, "", $i);  
        msg = msg $i ";"
      }; 
      if ($i ~ /userId/) { 
        # Cleaning column value :
        gsub(/(^(.*?)|\s{1,})userId:\s/, "",$i); 
        msg = msg $i ";"
      }; 
      i++
    } print msg
  } 
END {
  print NR
} ' 

$(grep -l id *.log) >> output.csv
  1. Я использовал метод gsub ()для очистки значений столбца somme, потому что у меня были грязные старые файлы журнала
  2. $ (grep -l id *.log )команда используется для вывода списка всех файлов журнала ввода awk
2
29.03.2020, 19:57
3 ответа

если вы cdв папку, в которой хранятся видеофайлы, вы сможете переместить файлы с помощью следующей команды:

mv -v *YYMMDD* /path-to-new-folder

При этом используется сопоставление с шаблоном для перемещения только тех файлов, которые имеют этот формат даты в имени файла. Я обычно использую опцию -v, поэтому команда распечатывается подробно, и вы знаете, что она что-то сделала.

-1
19.03.2021, 02:31

Одной из возможностей было бы использование GNU Awk (gawk), который имеет встроенные -функции управления временем. Например, (, предполагая, что если у вас есть gawk, у вас также есть реализации GNU cpи mv)

.
printf '%s\n' *.mp4 *.avi | gawk -F. '
  {
    datespec = sprintf("20%02d %02d %02d 00 00 00", substr($2,1,2), substr($2,3,2), substr($2,5,2)); 
    cmd = sprintf("echo cp -t %s/ -- %s", strftime("%Y-%m-%d\\(%a\\)",mktime(datespec)), $0);
    system(cmd)
  }
'
cp -t 2020-03-29(Sun)/ -- EFGHIJKH.200329.1080p.mp4
cp -t 2020-03-28(Sat)/ -- ABCDABCD.200328.avi

Удалите echo, как только убедитесь, что он работает правильно. Измените cpна mv, если вы хотите переместить, а не копировать.

Другим вариантом для случая перемещения может быть (ab )использование утилиты renameна основе Perl -:

$ rename -n -e 'BEGIN{use Time::Piece}' -e 's@^[^.]*[.]([0-9]{6})[.].*$@Time::Piece->strptime($1,"%y%m%d")->strftime("%Y-%m-%d(%a)/"). $_@e' *.mp4 *.avi
rename(EFGHIJKH.200329.1080p.mp4, 2020-03-29(Sun)/EFGHIJKH.200329.1080p.mp4)
rename(ABCDABCD.200328.avi, 2020-03-28(Sat)/ABCDABCD.200328.avi)

Здесь удалите -nпосле тестирования.

1
19.03.2021, 02:31

Если я вас правильно понял, вы можете попробовать это с GNU grepиdate:

shopt -s nullglob
for file in *.avi *.mp4; do 
  dat=$(echo "$file" | grep -Po "(?<=\.)[0-9]{6}(?=\.)")
  if [[ $(date "+%y%m%d" -d "$dat") ]]; then
    dir=$(date -d "$dat" "+%Y-%m-%d(%a)")
    cp "$file" "$dir"
  fi
done
1
19.03.2021, 02:31

Теги

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