我正在編寫一個腳本,用於按文件創建日期對下載資料夾進行排序。這是我正在使用的腳本:
#!/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 下面指出的那樣,使用find
with-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 -