创建脚本以根据日期或文件名移动文件

创建脚本以根据日期或文件名移动文件

我有一个 FTP 进程不断地将文件放入目录中。创建日期是文件名的一部分,格式如下:

YYYY-MM-DD-HH-MM-SS-xxxxxxxxxxx.wav

我想根据文件的创建日期将文件移动到另一个目录。我可以使用文件名或日期戳,以更容易的为准。只需要考虑月份和年份。我使用以下格式创建了目录:

Jan_2016
Feb_2016

我一直在手动创建目录并移动文件,但我想使用 bash 脚本自动执行此操作,如果该目录不存在,该脚本将创建该目录。

到目前为止我一直在做的是手动创建目录,然后运行以下命令:

MV ./2016-02*.wav Feb_2016/

答案1

### capitalization is important. Space separated.
### Null is a month 0 space filler and has to be there for ease of use later.
MONTHS=(Null Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)

cd /your/ftp/dir                  ### pretty obvious I think
for file in *.wav                 ### we are going to loop for .wav files
do                                ### start of your loop
    ### your file format is YYYY-MM-DD-HH-MM-SS-xxxxxxxxxx.wav so
    ### get the year and month out of filename
    year=$(echo ${file} | cut -d"-" -f1)
    month=$(echo ${file} | cut -d"-" -f2)
    ### create the variable for store directory name
    STOREDIR=${year}_${MONTHS[${month}]}

    if [ -d ${STOREDIR} ]         ### if the directory exists
    then
        mv ${file} ${STOREDIR}    ### move the file
    elif                          ### the directory doesn't exist
        mkdir ${STOREDIR}         ### create it
        mv ${file} ${STOREDIR}    ### then move the file
    fi                            ### close if statement
done                              ### close the for loop.

对于没有经验的人来说,这应该是一个很好的起点。尝试根据这些说明和命令编写脚本。如果遇到困难,您可以寻求帮助

答案2

这个脚本可能会有所帮助。 (请删除对实际 mv 文件的回显):

#!/bin/bash

shopt -s nullglob

month=(Jan Feb Mar May Apr Jun Jul Aug Sep Oct Nov Dec)

for y in 2016; do
    for m in {01..12}; do
        fn="$y-$m"
        dn="${month[10#$m-1]}_$y"
        [[ ! -d $dn ]] && mkdir -p "$dn"
        for file in ./"$fn"*.wav; do
            echo mv "$file" "./$dn/${file#\./}"
        done
    done
done

相关内容