2012-06-07 25 views
2

我非常在這個初學者和已經尋找答案我的問題,但沒有找到任何我明白如何執行。任何幫助將不勝感激。如何循環訪問腳本中的某些文件?

我有一個腳本:

FILE$=`ls ~/Desktop/File_Converted/` 
mkdir /tmp/$FILE 
mv ~/Desktop/File_Converted/* /tmp/$FILE/ 

所以我可以使用AppleScript的當文件被投進了這個桌面文件夾中說,創建一個臨時目錄,將文件中有和做其他的東西。然後我刪除臨時目錄。這是沒問題的,但問題是,如果另一個文件被丟棄到File_Converted目錄之前,我正在做的東西到文件我目前正在使用它將改變$ FILE變量的值,在腳本之前完成對當前文件的操作。

我想要做的是使用變量設置變量,例如$ FILE1。我檢查是否定義了$ FILE1,如果沒有,則使用它。如果它被定義,然後嘗試$ FILE2,等等......最後,當我完成時,我想回收變量,以便$ FILE1重新設置爲空,下一個文件放入File_Converted文件夾可以使用它再次。

任何幫助將不勝感激。我是新來的,所以我不知道從哪裏開始。

謝謝!

+0

聽起來像LIFO。不,我不知道如何在bash中做到這一點。 – starbolin

+0

變量一旦被賦值而沒有被明確地重新賦值就不會改變它們的值 - 添加一個新文件不會修改變量中已經存在的變量的結果 - 並且對於單個腳本執行也是唯一的(所以兩個'$ FILE1'中的相同腳本的副本可以有兩個不同的值;它們不會彼此改變)。現在,如果共享的_temporary directory_正在被壓縮,那會更有意義。 –

+0

您的AppleScript,inotify,cron作業或任何可以啓動腳本的內容。如果使用mktemp,則不必擔心併發運行會互相破壞。 –

回答

-1

你描述的是一個典型的競爭條件,其中目前尚不清楚的是有衝突的操作開始前一個操作完成。這些並不容易處理,但是通過處理腳本和編程,您將學到如此多的知識,即使僅僅是爲了學習,這樣做也是非常值得的。

我建議您首先查看lockfileflock聯機幫助頁。嘗試一些實驗。它看起來好像你可能有適合的能力,因爲你正在問正確的問題。

順便說一句,我懷疑你想殺死$

FILE$=`ls ~/Desktop/File_Converted/` 

順便說一句,@CharlesDuffy正確地指出,「在腳本中使用ls表示的東西本身並正在做錯誤的。請參閱mywiki.wooledge.org/ParsingLsmywiki.wooledge.org/BashPitfalls「。有人懷疑建議的lockfile練習會清除這兩點,儘管它可能需要幾個小時才能完成。

+1

這不僅僅是這些 - 在腳本中使用ls表示某些事情本身做錯了。見http://mywiki.wooledge.org/ParsingLs和http://mywiki.wooledge.org/BashPitfalls –

+0

@CharlesDuffy:謝謝。我現在修改的答案反映了您的評論。 – thb

+0

謝謝你們!現在在lockfile上運行一個人。 –

2

你的問題有點難以解析,但我認爲你真的不瞭解shell globslooping constructs。根據有什麼現在擴大球體,而不是早些時候或之後可能會有什麼。

DIR=$(mktemp -d) 
mv ~/Desktop/File_Converted/* "$DIR" 
cd "$DIR" 
for file in *; do 
    : # whatever you want to do to "$file" 
done 
+0

感謝您的答案!如果我讓你們合適,可以通過放入一個文件來啓動腳本,並且如果另一個文件被放入文件夾並且腳本的另一個實例被啓動,則該腳本實例的變量實例不會改變。這使事情變得簡單。謝謝! –

2

您不需要LIFO - 爲不同事件運行的腳本的多個副本不會與其變量名發生衝突。他們衝突的是共享的臨時目錄,並且您應該使用mktemp -d在每次腳本運行時創建一個具有新的,唯一的且保證不衝突的名稱的臨時目錄。

tempdir=$(mktemp -t -d mytemp.XXXXXX) 
mv ~/Desktop/File_Converted/* "$tempdir" 
cd "$tempdir" 
for f in *; do 
    ...whatever... 
done