创建文件创建日期的目录结构库

时间:2019-03-16 16:52:31

标签: bash

我正在bash脚本上基于创建的日期文件创建dir结构,例如对于2019-03-14 dir结构看起来像/ test / data / 2019/03/14,对于第二个文件create dir结构来创建/ test / data / 2019/01/01等。 目前我有成千上万个文件,因此根据创建日期,它会创建一个dir结构并将文件移动到其位置。

  • -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}"
  • 不确定如何使用这两个值“ FILE”和 “ CR_DATE”,然后首先创建目录/ data / new_location / 2019/03/14 /

  • 然后将文件从source_dir = / data / sample / zip移至 / data / new_location / 2019/03/14 /

2 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

#!/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 :(得分:0)

这里是我上面代码的小修改,可以正常工作

#!/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