【问题标题】:Move newly created file移动新创建的文件
【发布时间】:2023-03-07 11:19:01
【问题描述】:

我有以下代码,在转码完成后,我希望移动新创建的文件。但只有在之后,我不想写到另一个文件夹,因为它转码。这就是为什么我认为使用 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

现在我想这可能是notepad++中的一些字符隐藏在某个地方,所以我通过dos2uunix运行它。但我仍然遇到同样的错误。

现在我认为“${1%.}”.mp4 实际上并没有获取新创建的文件,而是在寻找一个名为“${1%.}”的文件。 mp4,不存在。

任何帮助将不胜感激。

【问题讨论】:

  • 将你的 5 行 if/else 子句替换为:TRANSCODEDIR=${1:-/path/to/file}
  • 这会将新的 mp4 移动到转换后的文件夹吗? TRANSCODEDIR=${1:-/path to/converted/folder} 还是会转码到新目录?
  • 这只是一种更紧凑的方式来避免您所拥有的if/then/else
  • +1 以对抗路过投票。

标签: linux ubuntu mv transcode handbrake


【解决方案1】:

find 不支持参数替换,需要将${1%.*} 传递给shell。但幸运的是,这并不难做到:

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 脚本包含三个命令,所有这些命令都对同一个输入文件进行操作。

【讨论】:

  • 非常好,这似乎工作得很好。这会按顺序执行吗?如果转码失败,ti 会尝试移动它吗?进入“当前”目录的文件来自其他地方,并有一个与之关联的文件夹,例如/path/to/current/directory/MKV 文件/file.mkv。当我移动这个文件时,我留下了一个空目录。无论如何要安全地删除目录, rm -rf *?
  • 没关系,我只是运行一个 cron 脚本来删除空目录。
  • 命令是无条件的,但您可以在单引号内运行任意复杂的脚本。如果 Handbrake 正确设置了它的退出代码,那么 bash -e -c '...' 将在出错时中断。
【解决方案2】:

您可以改用while read 循环并从process substitution 重定向输入。详情我在代码上做了cmets。

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

【讨论】:

  • 有点困惑我应该从哪里开始将文件移动到我假设的新目录(exec find "$TRANSCODEDIR"/ -type f)?
  • @Keelan 你打算有一个不同的目标目录吗?你的源目录是当前目录吗?
  • 是的,基本上我会运行这个程序来对当前目录中的文件进行转码。然后在每次转码完成后,它会删除原始文件并将新的 mp4 移动到另一个目录 /path/to/converted/folder。现在 remove exec 和 transcode 工作正常,我只是在寻找新的 mp4 来移动它时遇到问题。
  • @Keelan 如果您的目标文件已经放在目标目录中,您将不再需要移动它。请检查我的更新。我已经做了一些预测试,现在它可能会按照你的意愿工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2021-03-14
  • 1970-01-01
  • 2014-05-31
相关资源
最近更新 更多