从文件时间戳创建目录,然后在bash中将文件移动到该目录中

从文件时间戳创建目录,然后在bash中将文件移动到该目录中,bash,Bash,我有一个包含数百个文件(macos)的目录,我希望有一个bash脚本将每个文件复制到文件上创建标记的目录中。因此,如果temp.mp4是在2019-12-10创建的,则该文件将被复制到该目录,该目录可能存在,也可能不存在 如果不需要,我不想在临时文件中写入任何内容。我发现以下代码仅获取文件和日期YYYY-MM-DD格式: gls -lt --time-style=+"%Y-%m-%d" | awk '{print $6,$7}' 但我不确定如何迭代/测试(将它传输到另一个awk实例?)。伪代码

我有一个包含数百个文件(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的变化):

在我的目录中有两个文件无法移动。下面是目录的外观(ls-l):


我不确定如何将所有文件移动到相关目录。是否有一个特定的字符串将覆盖所有文件(AAA、AAA.AAA、AAA)?

访问文件信息的一个很好的工具是stat。因此,首先,请stat提供创建日期和文件名,以便我们可以迭代每个文件:

 stat -c '%w %n' *.mp4
通过切割的管道,该管道将丢弃您不想要的额外列(时间和时区):

现在,我们的输出是每个文件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反馈(这个答案背后的真正大脑:)

你似乎是指最后一次修改时间,而不是创建时间<代码>用于f in*;do d=$(统计数据-c%y“$f”);d=${d%%*};mkdir-p“$d”;mv-i“$f”“$d”;完成太棒了!正是“边读文件”这一部分让我感到困惑。我看过stat,但更熟悉ls。有趣的是,如果我使用“*”而不是“*.mp4”,这将不起作用。我有几个没有扩展名的文件无法移动。嗯,这很奇怪。你能提供一些细节吗?文件名不移动的示例是什么?我想您没有看到任何错误消息?您可能不想使用
%x
。这给出了最后一次访问文件的时间,而不是创建文件的时间(这取决于文件系统的安装方式)。我想用%w。谢谢你抓住了!
 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