我正在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 /
答案 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