2012-12-22 47 views
7

我想用Shell腳本按日期排序所有文件。如何使用shell腳本按名稱對文件進行排序

例如,在/Users/KanZ/Desktop/Project/Test/中有文件M1.h,A2.hF4.h

每個文件都有不同的時間。如何按日期和時間將所有這些文件從最舊到最新排序?

目前,我有一個重命名腳本:

cd /Users/KanZ/Desktop/Project/Test/ 
n=1 
for file in *.jpg; 
do 
    echo $file prefix=M file_name=M$n.jpg 
    echo $file_name n=$(($n+1)) 
    mv $file $file_name 
done 

我第一次運行腳本中的JPG文件將M1.jpgM2.jpgM3.jpg但如果我添加A1.jpg命名爲新的文件到該目錄,並運行該腳本再次,M1.jpgM2.jpgM3.jpg將被替換爲M4.jpg(在運行腳本之前,此文件被命名爲A1.jpg),因爲第一個字母是A並且在M之前。

我想獲得M1M2M3M4.jpg

+0

問題在中游改變了。它開始對'* .h'文件進行排序,但評論和代碼反映了排序'* .jpg'文件。提問時一致性很重要。 –

回答

10

ls命令可以很容易地排序最後修改時間:

$ ls -1t /Users/KanZ/Desktop/Project/Test 

要反向排序,包括-r選項:

$ ls -1tr /Users/KanZ/Desktop/Project/Test 

包括1告訴ls到每行輸出的一個文件沒有額外的元數據(如長度,修改時間等),如果您需要將列表發送給其他命令以進行進一步處理,這通常是shell腳本中需要的。

+0

這是從新到舊 - 這不是問什麼。 –

+0

然後根據需要使用'-r'標誌來更改順序。 –

3

(全新因爲這個問題改變)

試試這個:如果您需要按升序排列文件路徑排序

ls -tUr -d $PWD/* 

可能是有用的

cd /Users/KanZ/Desktop/Project/Test 
n=1 
for f in `ls -tr *.jpg`; do 
    mv $f M$n.jpg 
    n=$((n + 1)) 
done 
+0

什麼都沒有發生。你不應該指定文件的類型? 例如*。H *。jpg – kantawit

+0

你嘗試了什麼?結果是什麼? (沒有必要指定文件的後綴:如果沒有給出,所有文件都會顯示。) –

+0

我想先按時間和日期對jpg文件進行排序,之後我想將它們重命名爲A1.jpg A2.jpg A3.jpg。現在我可以重命名所有文件,但我想在重命名之前將它們從舊到新排序。 – kantawit

0

如果

0

您需要將-t選項傳遞給ls命令。 -t選項按修改時間排序,即按照字典順序對操作數進行排序之前最近修改的第一個。換句話說,可以使用以下命令顯示上次下載的文件。

打開終端並輸入以下命令。

ls -t 
相關問題