Linux

在文件夾 1 中搜尋文件,如果該文件不在文件夾 2 中,則執行腳本

  • November 9, 2015

folder1僅包含.flv文件。

folder2僅包含.mp4文件。

中的所有.flv文件都folder1應該有一個以 結尾的相應.mp4文件folder2

/folder1/123.flv/folder2/123.mp4

我需要一個腳本來查找任何.flv缺少的 a.mp4並執行一個腳本,該腳本將執行 mencoder 以創建相應的.mp4. 我已經盡力了,這就是我想出的,但我堅持使用 IF THEN 語句。

for i in `find /folder1 -type f -iname '*.flv' -printf "%f\n" | 
   sed 's/.flv//g'` ; do 
   if [[ -n $(find /folder2/$i.mp4 -exec grep \-q 0 {} \;) ]] then
       /scripts/script.sh $i  fi ; done

bash 腳本需要像這樣執行:

/scripts/script.sh $i 

所以文件名沒有任何副檔名。

試試這個:

find folder1 -type f -iname '*.flv' -exec bash -c \
   'f=${1#folder1/}; [ -f "folder2/${f%.flv}.mp4" ] || 
    scripts/script.sh "${1%.flv}"' none {} \;

這將使用名稱包含空格或其他難字元的文件。

這個怎麼運作

  • find folder1 -type f -iname '*.flv'

這會找到 flv 文件

  • -exec bash -c '...'

對於找到的每個 flv 文件,這會告訴 find 執行 bash,它在引號中執行腳本(見下文)。

  • f=${1#folder1/}

這將創建一個變數,該變數f具有 flv 文件的名稱,但沒有前導目錄。

  • [ -f "folder2/${f%.flv}.mp4" ]

這將測試是否存在相應的 mp4 文件。

  • ||

這告訴 bash 僅在前面的命令返回 false 時才執行後面的命令(換句話說,如果沒有找到這樣的 mp4 文件)。

  • scripts/script.sh "${1%.flv}"'

這會在那些缺少 mp4 文件的 flv 文件上執行您的腳本。提供給這些文件script.sh.flv部分已移除。

  • none {}

這告訴 bash 將字元串分配none$0(這個佔位符從不使用)並將由 找到的文件的名稱分配find{}shell 變數$1

  • \;

這標誌著 find-exec命令的結束。

引用自:https://unix.stackexchange.com/questions/241707