从文件时间戳创建目录,然后以bash将文件移至该目录

我有一个包含数百个文件(macos)的目录,并且我想让bash脚本将每个文件复制到文件上创建标记的目录中。因此,如果temp.mp4是在2019-12-10上创建的,则文件将被复制到该目录中,该目录可能存在也可能不存在。

如果不需要,我不想将任何内容写入临时文件。我发现以下代码仅获取文件和日期YYYY-MM-DD格式:

gls -lt --time-style=+"%Y-%m-%d" | awk '{print $6,$7}'

但是我不确定如何迭代/测试(将其插入另一个awk实例吗?)。伪代码:


  if ([ -f $7 ] && if ([ -d $6 ]  #If the file and directory exist
  {
    mv $7 $6  #move the file to the existing directory
  }
  else
  {
    mkdir $6 #create the directory based on date creation attribute of the file
    mv $7 $6 #move the file to the directory
  }

我不必担心递归地浏览目录。所有文件都在一个目录中。

============= 根据下面的一些反馈,我正在扩展我的问题以澄清我所看到的。这是我正在使用的脚本(请注意,从硬编码的“ * .mp4”更改为$ 1):

#!/bin/bash

gstat -c '%w %n' $1 | gcut --complement -f 2,3 -d' ' | while read FILE
do
   NAME=${FILE#* }
   DATE=${FILE%% *}
   [ -d ${DATE} ] || mkdir ${DATE}
   mv -i "${NAME}" ${DATE}/
done

在我的目录中,有两个文件不会移动。这是目录的样子(ls -l):

╰─ ls -l
total 16
drwxr-xr-x  9 awagoner  staff  288 Nov  6 21:44 2019-11-03
drwxr-xr-x  4 awagoner  staff  128 Nov  7 11:19 2019-11-06
-rw-r--r--  1 awagoner  staff  138 Mar 19  2019 Pipfile
-rw-r--r--@ 1 awagoner  staff  715 Nov  1 13:53 php_errorlog

我不确定如何将所有文件移动到关联的目录。是否有某个字符串可以覆盖所有文件(AAA,AAA.AAA,.AAA)?

zhaiguanghusha 回答:从文件时间戳创建目录,然后以bash将文件移至该目录

stat 是访问文件信息的绝佳工具。因此,首先,请让stat给出创建日期和文件名,以便我们可以迭代它们:

 stat -c '%w %n' *.mp4

通过 cut 将其放置在管道中,这将删除不需要的多余列(时间和时区):

 stat -c '%w %n' *.mp4 | cut --complement -f 2,3 -d' '

现在,我们的输出是每个文件1行,带有日期和文件名。文件名可能带有空格,因此在解析时请注意这一点。这一点将彻底解决问题:

 NAME=${FILE#* }
 DATE=${FILE%% *}   

最后,确保目录存在,并将文件移至新目录:

 [ -d ${DATE} ] || mkdir ${DATE}
 mv "${NAME}" ${DATE}/

将所有内容放在一起。这是您要运行的:

stat -c '%w %n' *.mp4 | cut --complement -f 2,3 -d' ' | while read FILE
do
   NAME=${FILE#* }
   DATE=${FILE%% *}
   mkdir -p ${DATE}
   mv -i "${NAME}" ${DATE}/
done

更新:使用上述jhnc的建议,在mv上添加-i标志

更新(2):更多jhnc反馈(此答案背后的真正大脑:))

本文链接:https://www.f2er.com/3149947.html

大家都在问