Переместить недавно созданный файл
У меня есть следующий код, и после завершения транскодирования я хочу переместить созданный файл. Но только после этого я не хочу писать в другую папку, так как она транскодируется. Вот почему я предполагаю, что использование 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, которого не существует.
Любая помощь будет оценена.
2 ответа
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 внутри одинарных кавычек содержит три команды, каждая из которых работает с одним и тем же входным файлом.
Вы можете использовать while read
цикл и перенаправленный ввод от замены процесса вместо. Я прокомментировал код для деталей.
#!/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.
ОБНОВИТЬ:
#!/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.