Создать базу данных структуры каталога по дате создания файла

#bash

#bash

Вопрос:

Я работаю над скриптом bash, чтобы создать структуру каталога на основе даты создания файла, например, для 2019-03-14 структура каталога выглядит как / test / data/2019/03/14 и для второго файла создайте структуру каталога для создания / тестирования / данных/2019/01/01 и так далее. В настоящее время у меня есть тысячи файлов, поэтому на основе даты создания создается структура каталога и перемещается файл в его местоположение.

  • -rw-r—— 3 usermq hadoop 460373 2019-03-14 10:21 /data/sample/zip/samele_732503e.zip

    -rw-r—— 3 usermq hadoop 534677 2019-01-01 10:21 /data/sample/zip/sample_16d7dd1.zip

Это то, что у меня есть на данный момент

 source_dir=/data/sample/zip
target_dir=/data/new_location
## This is giving me file name
hdfs dfs -ls "${source_dir}/*.zip" | awk '{print $8}'  | while read FILE; do
## This is giving me create date
hdfs dfs -ls "${source_dir}/*.zip" | awk '{print $5}'  | while read CR_DATE; do

FILENAME="$(basename "${FILE}")"

FILE_YEAR="$(echo "${CR_DATE}" | cut --bytes=01-04)"
FILE_MONTH="$(echo "${CR_DATE}" | cut --bytes=06-07)"
FILE_DAY="$(echo "${CR_DATE}" | cut --bytes=09-10)" 
REPORT_DIR="${target_dir}/year=${FILE_YEAR}/month=${FILE_MONTH}/day=${FILE_DATE}"    

$(hdfs dfs -test -e ${REPORT_DIR})
if [[ "$?" -eq "1" ]]; then
     $(hdfs dfs  -mkdir -p "${REPORT_DIR}")
fi

hdfs dfs -mv "${FILE}" "${REPORT_DIR}"
  
  • Не уверен, как просмотреть эти два значения «ФАЙЛ» и
    «CR_DATE» и сначала создать каталог first /data/new_location/2019/03/14/

  • Затем переместите файл из source_dir=/data/sample/zip в /data/new_location/2019/03/14/

Комментарии:

1. Просто небольшой вопрос, но что вы пытались до сих пор решить эту головоломку?

Ответ №1:

Вы можете попробовать что-то вроде этого:

 #!/bin/bash

base_dir=/home/user/data # the path to the directory

for file in "$base_dir"/sample/zip/*.zip;do
        dir="$(stat -c %x $file|cut -d' ' -f1)"
        mkdir -p "$base_dir/${dir//-//}"
        cp -v "$file" "$base_dir/${dir//-//}"
done
  

Комментарии:

1. ваш код может быть правильным в локальной файловой системе, у меня это не работает, поскольку файлы расположены в папке HDFS, чтобы просмотреть файлы в base_dir, мне нужно использовать папку hdfs dfs -ls dir, где находятся файлы, мой приведенный выше код нуждается в некоторой модификации для записи даты и соответствующего файла в цикле.

Ответ №2:

Вот небольшая модификация моего приведенного выше кода, она работает

 #!/bin/bash

source_dir=/data/sample/zip
target_dir=/data/new_location
## This is giving you creation date and file name
hdfs dfs -ls "${source_dir}/*.zip" | awk '{print $6 "-" $8}'  | while read FILE; do
FILENAME="$(basename "${FILE}")"

FILE_YEAR="$(echo "${FILE}" | cut --bytes=01-04)"
FILE_MONTH="$(echo "${FILE}" | cut --bytes=06-07)"
FILE_DAY="$(echo "${FILE}" | cut --bytes=09-10)"

REPORT_DIR="${target_dir}/year=${FILE_YEAR}/month=${FILE_MONTH}/day=${FILE_DATE}"    

$(hdfs dfs -test -e ${REPORT_DIR})
if [[ "$?" -eq "1" ]]; then
   $(hdfs dfs  -mkdir -p "${REPORT_DIR}")
fi


hdfs dfs -mv "${source_dir}/${FILENAME}" "${REPORT_DIR}"

done