#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