按文件中包含的日期组织文件

按文件中包含的日期组织文件

我目前正在尝试编写一个脚本,该脚本可以按日期将文件列表组织到子目录中。日期包含在每个文件的第一行,格式为YYYY-MM-DD.我已经使用 head 命令从每个文件中提取了第一行,并将其替换为 ,-使其/变为YYYY/MM/DD.这样我就可以将它用作文件路径。

然后我想创建子目录YYYY>MM>DD,例如,包含日期的文件2015/10/19存储在文件路径./2015-> ./2015/10->中./2015/10/19。这些子目录应该创建在~/fileList/.

这是我到目前为止的代码。

for file in ~/fileList/*
do
   head -1 $file | tr "-" "/")
done

这是一个示例文件

2001-02-03
Thursday
Paris
44952

我正在努力寻找创建子目录并将每个文件存储在正确目录中的方法。任何代码建议都将不胜感激。

我正在使用 bash shell。

答案1

应执行以下操作:

for file in ~/fileList/*
do
    newpath=$(head -1 "$file" | tr '-' '/')
    mkdir -p "$newpath"
    echo "would now execute 'mv $file $newpath'"
done

这会将转换后的日期存储在变量中$newpath,并创建该目录以及任何缺失的父目录(如果该目录尚不存在)。该子目录将在您运行脚本的目录中创建。

在当前的形式中,它将打印将要执行的命令。当您满意后,更改为

mv "$file" "$newpath"

更新:由于您声明目标目录将位于文件最初所在的源目录下方,因此有必要进行检查,以确保您多次运行脚本时,它不会偶然发现这些新生成的条目。

  • 如果您可以通过文件扩展名(例如 )来识别文件.txt,则可以使循环更加具体:
    for file in ~/fileList/*.txt
    do
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
        ...
    done
    
  • 否则,一种方法是仅接受常规文件作为操作数:
    for file in ~/fileList/*
    do
        if [[ ! -f $file ]]; then continue; fi
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
        mkdir -p "$newpath"
        mv "$file" "$newpath"
    done
    

相关内容