2013-09-24 11 views
0

У меня есть следующий код, и после завершения перекодировки я хочу переместить вновь созданный файл. Но только после этого я не хочу писать в другую папку, как это trancodes. Вот почему я предполагаю использовать exec лучше, поскольку это будет обрабатываться только в том случае, если предыдущий exec прочитал true. Также обратите внимание, что в текущей папке может быть несколько файлов.Переместить только что созданный файл

#!/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

Очень приятно, это работает очень хорошо. Будет ли это исполнено в порядке? Что делать, если перекод не сработает, попытается ли его переместить? Файлы, поступающие в «текущий» каталог, происходят откуда-то еще и имеют папку, связанную с ними, например./path/to/current/directory/MKV FILE/file.mkv. Когда я перемещаю этот файл, я оставляю пустой каталог. В любом случае, чтобы безопасно удалить каталог, rm -rf *? – Keelan

+0

Nevermind Я просто запускаю 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 find «$ TRANSCODEDIR»/-type f)? – Keelan

+1

@Keelan Вы собираетесь иметь другой целевой каталог? Является ли ваш исходный каталог текущим каталогом? – konsolebox

+0

Да, в основном я запустил эту программу, чтобы перекодировать файл sin в текущий каталог. Затем после каждого перекода он завершает удаление оригинала и перемещает новый mp4 в другой каталог/путь/в/преобразовать/папку. Теперь удаленный exec и transcode работают нормально, у меня просто проблема с поиском нового mp4 для его перемещения. – Keelan