bash 脚本中日期格式奇怪

bash 脚本中日期格式奇怪

我正在编写一个脚本,用于按文件创建日期对下载文件夹进行排序。这是我正在使用的脚本:

#!/bin/bash

cd ~/Downloads
for FILENAME in *
do
    if [[ -f $FILENAME ]]; then
        date="$(ls -l $FILENAME | tr -s ' ' | cut -d ' ' -f 6 | tr -d '.')"
        mkdir -vp "$date"
        find . -maxdepth 1 -type f -name $FILENAME -exec mv {} "$date" \;
    fi
done
cd -

该脚本创建的文件夹的名称Jun让我相信某处正在发生某种转换。

如果我只做一个

ls -l test0 | tr -s ' ' | cut -d ' ' -f 6 | tr -d '.'

日期显示19062014正确。

bash -x这是脚本的结果:

sigurd@Goliath ~ -> bash -x clean
+ cd /home/sigurd/Downloads
+ for FILENAME in '*'
+ [[ -f test0 ]]
++ ls -l test0
++ tr -s ' '
++ cut -d ' ' -f 6
++ tr -d .
+ date=Jun
+ mkdir -vp Jun
mkdir: created directory 'Jun'
+ find . -maxdepth 1 -type f -name test0 -exec mv '{}' Jun ';'
+ for FILENAME in '*'
+ [[ -f test1 ]]
++ ls -l test1
++ tr -s ' '
++ cut -d ' ' -f 6
++ tr -d .
+ date=Jun
+ mkdir -vp Jun
+ find . -maxdepth 1 -type f -name test1 -exec mv '{}' Jun ';'
+ cd -
/home/sigurd

我正在寻找的功能是脚本应根据文件的创建时间将文件移动到名为 等的19_06_2014文件夹中。20_06_2014

答案1

我建议使用日期格式,例如2014-06-19.这样 als就会按时间顺序显示它们。

在 GNU 系统上:

#! /bin/bash -
cd ~/Downloads &&
  find . -maxdepth 1 -type f -printf '%p\0%TF\0' |
    while IFS= read -rd '' file && read -d '' date; do
      mkdir -vp "$date" && mv "$file" "$date"
    done

zsh任何系统上:

#! /bin/zsh -
zmodload zsh/stat || exit

cd ~/Downloads &&
  for file (./*(ND.)) {
    zstat -A date -F %F +mtime $file &&
      mkdir -p $date &&
      mv $file $date
  }

答案2

大胆猜测:ls当您以交互方式尝试该命令时,您有一个正在使用的别名,并且该别名未在脚本中使用。也许是这样的?

alias ls="ls --full-time"

请注意,传统观点认为尝试解析ls是一个坏主意。假设您使用的是 Linux 计算机,类似这样的操作可能更好:

stat "$FILENAME" | awk '/^Modify: /{print $2}'

编辑:或者,正如 Stéphane 下面指出的那样,使用findwith-printf甚至更好。的输出stat比 更容易预测ls,但-printf允许完全由您控制的输出格式。

答案3

这是完整的代码

#!/bin/bash
cd ~/Downloads
for FILENAME in $(find . -maxdepth 1 -type f); do    
    DATE=$(stat "$FILENAME" | awk '/^Modify: /{print $2}')
    [ ! -d "$DATE" ] && mkdir -vp "$DATE"

    mv "$FILENAME" "${DATE}/$FILENAME"
done
cd -

相关内容