用于为电影文件创建文本文件的批处理作业

用于为电影文件创建文本文件的批处理作业

我想在重命名之前保留电影名称。可以一次性对文件夹中的所有文件执行此操作吗?

因此,从当前电影名称“发条橙_(1971) Stanley Kubrick(DivX).avi”开始,脚本将把一个文本文件命名为“发条橙_(1971) Stanley Kubrick(DivX)”,并在新文件中输入全名“发条橙_(1971) Stanley Kubrick(DivX).avi”...

请逐步解释。

答案1

Steeldriver 已经抢先一步,而且做得更优雅。至少十年内我都不会进入他的课堂。但由于我已经编写并测试了它,我会发布它,仅供参考。以下代码将放入脚本中。然后在终端中运行该脚本,唯一的参数是包含要处理的文件的目录。如果您想从 GUI 文件浏览器运行它,您需要使用类似 的内容来调用它xterm -e /path/to/this_script.sh $ff即文件浏览器在 /path/to/directory 上传递的任何变量。

因此,使用编辑器打开一个纯文本文件,例如 geany、leafpad 或(shudder)gedit。

将下面的代码复制到其中,从下面两行“#!/bin/bash”开始。

##### 不要复制此行,从下一行以“#!”开头开始。

#!/bin/bash

# repeats until you enter a valid directory
# you might add a test to make sure you have adequate permissions.
DIr="$1"
while [ ! -d "$DIr" ] || [ $DIr = / ]; do
      read -p "$DIr is not a valid argument. Enter a 
      directory other than '/' with files you want to process:" DIr
done

# canonicalizes directory name
DIr="$(readlink -f "$DIr")"

for FILE in $DIr/*; do
    BASENAMe="$(basename "$FILE")"
    BASE_NAME_minus_ext="$(echo -n "$BASENAMe" | rev | cut -d'.' -f2- | rev)"

    # If you want 'em all in a single list, instead use:
    # echo "$BASENAMe" >> "$DIr/List_of_names_minus_extensions"
    echo "$BASENAMe" > "$DIr"/"$BASE_NAME_minus_ext"

done

##### 请勿复制此行。复制并包括上面的“完成”。不再复制。

使用方便的名称保存文件,例如“list.sh”,不带引号。将其移动到路径中的某个目录。您可以使用以下命令显示路径:

echo $PATH

这将返回一个字符串,该字符串是一堆用冒号(“:”字符)分隔的目录。各个目录名称都以“/”开头。它们不包括“:”。任何这些目录都可以。如果它在您的路径中,我想最常规的目录将是:

在/usr/本地/bin

但只要它是其中之一,这真的无关紧要。如果您使用图形文件浏览器(如 Nautilus、Thunar 或 Pcmamfm)执行此操作,请右键单击脚本(即您刚刚创建和移动的文件),然后单击“属性”,然后单击“权限”(如果这是一个单独的选项卡)。将其设置为您可以执行。有各种各样的方法可以做到这一点。最方便的是将其设置为由您的用户名和同名组拥有,并检查可执行、可读写,但所有者和组不能。

如果您从命令行执行此操作:

chmod -v ug+r+w+x /usr/local/bin/list.sh 

使用您将文件放入的路径上的任何一个目录以及您为其指定的文件名。

或者,如果失败了,请按顺序一次执行以下两个操作:

sudo chown your_user_name:your_user_name /usr/local/bin/list.sh
sudo chmod -v ug+r+w+x /usr/local/bin/list.sh 

现在您应该有一个可执行脚本,可以通过在终端中输入它的名称并按回车键来调用它,或者像这样:

list.sh

或者使用您希望它像这样操作的目录的名称:

list.sh /path/to/directory_that_has_your_movies

如果您没有包含完整的 /path/to/directory_you_want_acted_upon,它会合理地猜测在哪里可以找到它。它可能会猜错。如果您想节省击键次数,可以给脚本起一个较短的名称,如“lis”,或者如果您想更容易记住它的作用,可以给它起一个较长的名称,如“list_files_within_without_extensions.sh”。脚本名称以“.sh”结尾是一种常见的惯例,这样您只需查看文件的名称即可知道它是什么。您可以随意命名,甚至可以命名为“George Humperdink, III”,但空格和逗号往往会带来麻烦。

更多想法:鉴于您对 sudodus 的回复,我必须提醒,不要使用 sudo 来运行他的命令或我的脚本。我想不出任何理由让电影归 root 所有或放在 root 拥有的目录中。它们绝对不应该由 root 在查看器中运行。在 'nix 生态系统中,我们没有太多的恶意软件问题,但以 root 身份调用媒体播放器,甚至图片查看器,都是自找麻烦,如果有足够多的人自找麻烦,就会有人自找麻烦。因此,文件必须可供普通用户读取,将它们保存在普通用户无法读取、写入和“执行”的目录中会非常尴尬。如果他的命令或我的脚本以 sudo 可以阻止的方式失败,那么您需要更改文件或它们所在目录的权限。使用 sudo 就像因为空调使房间太冷而点燃家具一样。通过创建 root 拥有的列表文件,它只会给您带来更多权限问题。除非迫不得已,否则永远不要使用 sudo,并且只有在有意义的情况下才使用。如果没有必要使用 sudo,那么就解决问题,不要绕过它。

另外,如果您对命令进行逻辑更改,该命令将适用于其他扩展。该脚本适用于任何扩展。

您会注意到中间附近有一行注释掉的行,表示您希望它在所作用的目录中创建一个列表,还是为每个电影创建一个单独的文本文件。在行首添加“#”标记称为“注释掉”该行。这意味着它是供人类阅读的注释,而 bash 会忽略它。您可以通过更改注释行中的哪一行来使脚本以任何方式工作。一行应该被注释,另一行则不被注释。

相关内容