создавать подпапки из указанных c символов файла в linux - PullRequest
0 голосов
/ 31 марта 2020

У меня есть файлы в следующем формате test_YYYYMMDDHHMMSS.csv

test_20200328223607.csv
test_20190523112250.csv
test_20180201065548.csv

Мне нужно переименовать файл, затем создать путь из его имени и добавить его в созданный путь с этим форматом 2020/03/28/223607.csv

Пример: test_YYYYMMDDHHMMSS.csv => mkdir YYYY/MM/DD из имени файла, затем rename файл будет HHMMSS.csv и добавьте его к YYYY/MM/DD

Ответы [ 2 ]

1 голос
/ 31 марта 2020

На основании более раннего ответа @Cyrus:

#!/bin/bash

# define a regular expression for use with the `[[` conditional command later on to match filename patterns
re='^test_(....)(..)(..)(......)\.csv$'

# iterate through all csv files in the current directory
for i in *.csv; do
  # if filename does not match the regular expression, move on to the next loop iteration
  [[ "$i" =~ $re ]] || continue
  # the [[ conditional command leaves match results behind in an array variable named BASH_REMATCH

  # create a directory path using results; nop if directory already exists
  mkdir -p "${BASH_REMATCH[1]}/${BASH_REMATCH[2]}/${BASH_REMATCH[3]}"

  # ... and relocate the file to the (newly created) directory whilst giving it a new name
  mv "$i" "${BASH_REMATCH[1]}/${BASH_REMATCH[2]}/${BASH_REMATCH[3]}/${BASH_REMATCH[4]}.csv"
done
0 голосов
/ 31 марта 2020

Вы можете использовать cut для получения подстрок и извлечения имен каталогов таким способом. Там может быть более чистое решение, но что-то вроде этого должно работать

for i in *.csv
do
  # split the string
  IFS='_'
  read -ra ADDR <<< "$i"

  year=$(echo "${ADDR[1]}" | cut -c1-4)
  ... get other sub strings ...
  path=${year}/${month}/etc
  mkdir -p "$path"
  mv "$i" "${path}"/"${seconds}".csv
done
...