2011-12-29 116 views
1

我想寫一個逐行掃描文件的bash腳本(忽略頭文件),從每行的開頭提取一個文件名,然後找到一個文件這個名字在一個目錄中並將其移動到另一個目錄。我將循環處理數百個這樣的文件並移動超過一百萬個單獨的文件。該文件的示例是:BASH shell腳本文件解析[新手]

ImageFileName Left_Edge_Longitude Right_Edge_Longitude Top_Edge_Latitude Bottom_Edge_Latitude 

21088_82092.jpg: -122.08007812500000 -122.07733154296875 41.33763821961143 41.33557596965434 

21088_82093.jpg: -122.08007812500000 -122.07733154296875 41.33970040427444 41.33763821961143 

21088_82094.jpg: -122.08007812500000 -122.07733154296875 41.34176252364274 41.33970040427444 

我想忽略第一行然後抓取21088_82092.jpg作爲變量。文件名可能並不總是相同的長度,但他們將始終具有格式digit_digits.jpg

任何有效的方法的幫助,非常感謝。

+0

編輯您的帖子以向我們展示您迄今爲止已嘗試過的內容幷包含任何錯誤輸出。幾乎每週都會問這樣的問題,所以請嘗試在這裏搜索。祝你好運。 – shellter 2011-12-29 04:20:43

回答

0

這應該讓你開始:

$ tail -n +2 input | cut -f 1 -d: | while read file; do test -f $dir/$file && mv -v $dir/$file $destination; done 
+0

這很棒,完全符合我的需求。 – user1120422 2011-12-29 05:29:37

0

您可以構建一個腳本,會做這樣的事情,然後只需運行該腳本。下面的命令會給你一個腳本,將文件從一個位置複製到另一個,但你可以使腳本生成更復雜簡單地通過改變awk輸出:

pax:~$ cat qq.in 
ImageFileName  Left_Edge_Longitude Right_Edge_Longitude 
21088_82092.jpg: -122.08007812500000 -122.07733154296875 
21088_82093.jpg: -122.08007812500000 -122.07733154296875 
21088_82094.jpg: -122.08007812500000 -122.07733154296875 

pax:~$ awk -F: '/^[0-9]+_[0-9]+.jpg:/ { 
     printf "cp /srcdir/%s /dstdir\n",$1 
    } {}' qq.in 

cp /srcdir/21088_82092.jpg /dstdir 
cp /srcdir/21088_82093.jpg /dstdir 
cp /srcdir/21088_82094.jpg /dstdir 

您捕捉到腳本的輸出(最後三行)到另一個文件,那麼這個文件就是你的腳本來做實際的拷貝。

+0

或者,一旦你確信它會做你想做的事,就把腳本管到'sh'。 – 2011-12-29 04:47:31

+0

你可以通過使用'awk -F:'來分割冒號,然後'$ 1'就是你需要的文件名。 – 2011-12-29 04:48:29

+0

不錯,@Jonathan,編輯適合。 – paxdiablo 2011-12-29 05:01:04