2015-02-10 102 views
0

簡而言之,寫了一個小腳本來清理一些目錄,我已經合併了多個來源的目錄/文件,其中我使用cp命令和--backup=numbered功能,以便具有相同名稱的文件具有附加後綴.~1~以避免覆蓋。然後,我運行fdupes刪除重複的文件,在某些情況下,fdupes刪除了沒有從cp命令(原始文件)追加後綴的文件,所以我想掃描目錄查找帶有後綴cp命令的文件如果該文件不存在與後綴刪除,我會移動mv該文件,否則我會離開它,以避免刪除任何東西fdupes並不認爲它是重複的。找到返回的結果

問題是測試條件if [ -f ... ]下面的代碼的一部分返回倒過來的結果比它應該和我不明白爲什麼。例如,當文件存在時它將返回false,當文件不存在時它將返回true。我通過顛倒我想要根據倒排返回碼進行的操作來解決這個問題,並驗證它是按照預期工作的,並且它是這樣運行的,但是想知道是否有人知道它爲什麼會按照它的方式工作。我不是任何方式的bash腳本專家,所以我可能錯過了一些簡單的東西。

#!/bin/bash 
logfile=$$.log 
exec > $logfile 2>&1 

IFS=' 
' 
#set -f 

for FILE in $(find . -type f -regextype posix-extended -regex '^.*(\.~[0-9]+~)+$') 
do 
    FILE2=${FILE%%.~[0-9]*} # remove the suffix 
    if [ -f "${FILE2}" ] 
    then 
     echo ERROR: "${FILE2}" already exists! 
    else 
     echo "${FILE}" renamed "${FILE2}" 
     mv "${FILE}" "${FILE2}" 
    fi 
done 
+0

我會去Python或Perl爲此。在所有文件上執行'os.walk()',創建一個'dict',其中的鍵是後綴名,值是最近的後綴。如果您看到較小的數字,請替換該值;如果您看到裸露的文件名,請將其取消。現在,最後,包含一個數字的dict中的任何條目都包含最新的備份文件,其中thre不是主文件;循環並移動。 – tripleee 2015-02-11 09:35:19

回答

0

您可能能夠通過修改腳本來顯示錯誤消息都FILEFILE2看問題。腳本中存在一些可能導致混淆的小問題(但不是「倒置」邏輯):

  • find輸出未排序。如果您有多個備份文件,隨機選擇一個將替換原始文件;
  • 您可以使用類似|sort -t~ -n -k2的表達式在find命令末尾對輸出進行排序。
  • 正則表達式允許~[0-9]~模式的多個匹配。可以想象,你可能會有一些奇怪的文件,以~1~~2~結尾。
  • 刪除後綴的部分假定一個單獨的~[0-9]~位於文件名的末尾。嵌入的~0,例如foo~0bar~1~將減少FILEfoo。解決這個問題的方法會更麻煩(因爲後綴剝離使用通配符),但是可以通過匹配顯式數字位的case語句來完成(可能三位數就足夠了)。
+0

是的,當我注意到發生了什麼時,我確實擁有它,所以我可以看到$ FILE和$ FILE2,並且看不到任何異常情況。對於文件後綴我有。〜1〜和。〜1〜。〜2〜正如你所提到的,我認爲我看到的最多的是三個,但這並不是說沒有更多...它的許多目錄和數千我正在處理的文件。這就是爲什麼我在正則表達式中使find命令足夠靈活的原因。 – 2015-02-11 01:17:05

+0

根據我的理解,刪除後綴的部分將是貪婪(%%),並會從第一個〜1〜刪除到文件名的末尾,並且從測試中看起來就是這樣做的。在最初的測試過程中,我觀察到目標文件被識別得很好,後綴被正確刪除,但文件存在的測試似乎是倒置的......非常奇怪。我試圖在第二個測試腳本中進行復制,似乎無法在該腳本中複製該問題。 – 2015-02-11 01:28:50

+0

複製問題有幾種可能性(a)你的腳本確實修改了文件系統,(b)當然,「find」沒有被排序。 – 2015-02-11 02:07:01