2013-09-24 45 views
0

我有以下代碼,並在轉碼完成後,我希望移動新創建的文件。但是之後,我不想在轉碼時寫入其他文件夾。這就是爲什麼我認爲使用exec更好,因爲如果以前的exec讀取爲真,只會處理它。另請注意,當前文件夾中可能存在多個文件。移動新創建的文件

#!/bin/bash 
# 
# Change this to specify a different handbrake preset. You can list them by running:  "HandBrakeCLI --preset-list" 
# 
PRESET="AppleTV 2" 
if [ -z "$1" ] ; then 
TRANSCODEDIR="/path/to/folder" 
else 
TRANSCODEDIR="$1" 
fi 
find "$TRANSCODEDIR"/* -type f -exec bash -c 'HandBrakeCLI -i "$1" -o "${1%.*}".mp4 -- preset="$PRESET"' __ {} \; -exec rm {} \; 

我的Linux的小知識,我想也許:

#!/bin/bash 
# 
# Change this to specify a different handbrake preset. You can list them by running:  "HandBrakeCLI --preset-list" 
# 
PRESET="AppleTV 2" 
if [ -z "$1" ] ; then 
TRANSCODEDIR="/path/to/folder" 
else 
TRANSCODEDIR="$1" 
fi 
find "$TRANSCODEDIR"/* -type f -exec bash -c 'HandBrakeCLI -i "$1" -o "${1%.*}".mp4 -- preset="$PRESET"' __ {} \; -exec rm {} \; -exec mv '"${1%.*}".mp4'  "/path to/converted/folder" \; 

但這只是推出:

mv: cannot stat â"${1%.*}".mpâ4: No such file or directory 

現在,我想也許這是從記事本的某些字符++躲在某處所以我通過dos2uunix運行它。但是我仍然得到相同的錯誤。現在我認爲「$ {1%。}」.mp4實際上並沒有獲得新創建的文件,而是正在尋找名爲「$ {1%。}」的文件.mp4,它不會不存在。

任何幫助,將不勝感激。

+1

將您的5行if/else子句替換爲:'TRANSCODEDIR = $ {1: -/path/to/file}' –

+0

這會將新mp4移動到轉換後的文件夾嗎? TRANSCODEDIR = $ {1: - /路徑/轉換/文件夾}或將此代碼轉換到新的目錄? – Keelan

+0

這只是一種更緊湊的方法來避免你在那裏的if/then/else。 – tripleee

回答

1

find不支持參數替換,你需要傳遞${1%.*}的外殼。但幸運的是,這不是很難做到:

find "$TRANSCODEDIR" -type f -exec bash -c 'HandBrakeCLI -i "$1" -o "${1%.*}".mp4 -- preset="$PRESET"; 
    rm "$1"; 
    mv "${1%.*}".mp4 "/path/to/converted/folder"' _ {} \; 

所以只是爲了澄清; 「頂級」是find -exec bash -c '...' _ {} \;,單引號內的Bash腳本包含三條命令,所有這些命令都在相同的輸入文件上運行。

+0

非常好,這似乎工作得很好。這是否按順序執行?如果轉碼失敗,ti會嘗試移動它? 進入「當前」目錄的文件來自其他地方並具有與它們相關聯的文件夾,例如,/path/to/current/directory/MKV FILE/file.mkv。當我移動這個文件時,我剩下一個空目錄。無論如何要安全地刪除目錄,rm -rf *? – Keelan

+0

沒關係我只是運行一個cron腳本來刪除空目錄。 – Keelan

+1

這些命令是無條件的,但您可以在單引號內運行任意複雜的腳本。如果Handbrake正確設置其退出代碼,那麼'bash -e -c'...''將會出錯。 – tripleee

1

您可以改用while read循環,並使用process substitution的重定向輸入。我對代碼中的細節發表了評論。

#!/bin/bash 

# 
# Change this to specify a different handbrake preset. You can list them by running:  "HandBrakeCLI --preset-list" 
# 
PRESET="AppleTV 2" 

if [[ -z $1 ]] ; then 
    TRANSCODEDIR="/path/to/file" 
else 
    TRANSCODEDIR="$1" 
fi 

while read -r FILE; do 
    echo "Converting $FILE to ${FILE%.*}.mp4." ## Optional message that could really be helpful. 
    HandBrakeCLI -i "$FILE" -o "${FILE%.*}".mp4 && rm "$FILE" ## Remove file only if process was successful (HandBrakeCLI returns zero return code). 
done < <(exec find "$TRANSCODEDIR"/ -type f) ## No need to specify * and do pathname expansions since we're searching it recursively anyway. 

UPDATE:

#!/bin/bash 

# 
# Change this to specify a different handbrake preset. You can list them by running:  "HandBrakeCLI --preset-list" 
# 
PRESET="AppleTV 2" 

SOURCEDIR=. 

if [[ -z $1 ]] ; then 
    TRANSCODEDIR="/path/to/dir" 
else 
    TRANSCODEDIR="$1" 
fi 

SOURCEDIR=${SOURCEDIR%/}/ 
OFFSET=${#SOURCEDIR} 

while read -r FILE; do 
    SUBPART=${FILE:OFFSET} 

    # Prepare target directory. We create subdirectories to prevent conflict within files having the same name. 

    TDIR=${SUBPART%/*} 
    TDIR=${TRANSCODEDIR%/}/$TDIR 

    mkdir -p "$TDIR" || { 
     echo "Unable to create $TDIR." 
     continue ## Continue loop if we can't create the directory." 
    } 

    # Convert 

    TFILE=${SUBPART%.*}.mp4 
    TFILE=${TRANSCODEDIR%/}/$TFILE 

    echo "Converting $FILE to $TFILE." ## Optional message that could really be helpful. 
    HandBrakeCLI -i "$FILE" -o "$TFILE" && rm "$FILE" ## Remove file only if process was successful (HandBrakeCLI returns zero return code). 
done < <(exec find "$SOURCEDIR" -type f) ## No need to specify * and do pathname expansions since we're searching it recursively anyway. 
+0

有點困惑,我會在哪裏開始將文件移動到它的新目錄我假定(exec找到「$ TRANSCODEDIR」/ -type f)? – Keelan

+1

@Keelan你打算有不同的目標目錄嗎?你的源目錄是當前目錄嗎? – konsolebox

+0

是的,基本上我會運行這個程序來轉換當前目錄下的文件。然後在每個轉碼完成後,它會刪除原稿並將新的mp4移動到另​​一個目錄/路徑/到/轉換/文件夾中。現在刪除EXEC和轉碼工作正常,我只是有一個問題,找到新的MP4來移動它。 – Keelan

相關問題