Bash

bash腳本中日期的奇怪格式

  • June 20, 2014

我正在編寫一個腳本,以按文件創建日期對我的下載文件夾進行排序。這是我正在使用的腳本:

#!/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_201420_06_2014

瘋狂的猜測:ls當您以互動方式嘗試命令時,您有一個正在使用的別名,並且腳本中沒有使用該別名。大概是這樣的吧?

alias ls="ls --full-time"

請注意,傳統觀點認為嘗試解析ls是一個壞主意。假設你在一台 Linux 機器上,這樣的事情可能更可取:

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

編輯:或者,正如 Stéphane 在下面指出的那樣,使用findwith-printf會更好。的輸出stat比 更容易預測ls,但-printf允許完全由您控制的輸出格式。

我建議使用日期格式,例如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
 }

引用自:https://unix.stackexchange.com/questions/138104