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
。
瘋狂的猜測:
ls
當您以互動方式嘗試命令時,您有一個正在使用的別名,並且腳本中沒有使用該別名。大概是這樣的吧?alias ls="ls --full-time"
請注意,傳統觀點認為嘗試解析
ls
是一個壞主意。假設你在一台 Linux 機器上,這樣的事情可能更可取:stat "$FILENAME" | awk '/^Modify: /{print $2}'
編輯:或者,正如 Stéphane 在下面指出的那樣,使用
find
with-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 }