【问题标题】:Move files to different directories based on file name tokens根据文件名标记将文件移动到不同的目录
【发布时间】:2016-03-21 17:52:19
【问题描述】:

我正在寻找一个脚本来从目录中移动文件:

/home/mydir/

基于文件名中的标记到另一个目录。我有一堆这样命名的文件:

red_office_mike_2015_montreal_546968.ext

$color_$location_$name_$year_$city_$numbers.extension(文件将是各种电影文件:mov、mp4、mkv 等)

我希望脚本将文件移动到以下位置:

/dir/work/$color/$name

然后验证文件是否复制成功,一旦复制就删除原始文件。

如果脚本在不存在的情况下创建 to 目录,我也会喜欢它。

因此,总而言之,我需要一个脚本来根据下划线分隔的标记移动文件,如果目录不存在,则创建该目录,验证成功复制(可能通过大小检查),然后删除原始文件。

我正在使用 linux,并且希望使用 bash 脚本。我给出的变量是通用的,我会在脚本中加入一些其他的东西,我只是在寻找构建骨架的帮助。

提前感谢您的帮助!

【问题讨论】:

  • 如果您正在寻找一种方法来标记您的字符串,请使用read 和自定义IFSIFS='_.' read -r color location name year city numbers ext <<< red_office_mike_2015_montreal_546968.ext。如果您要求为您编写脚本,那就错地方了,伙计。

标签: linux bash automation copying


【解决方案1】:

它不是一个 bash 脚本,但是 perl 在这种事情上要好得多,并且安装在所有 Linux 系统上

while(<>) {
    chomp;
    $file = $_;
    ($colour, $location, $name, $year, $city, $numbers) = split(/_/,$file);
    $dest0 = "/dir/work/$colour";
    $dest1 = "$dest0/$name";
    mkdir ($dest0) unless (-d $dest0);
    mkdir ($dest1) unless (-d $dest1);
    rename ($file, "$dest1/$file");
}

脚本在下划线字符处拆分您的输入文件,创建到目标的所有目录,然后将文件重命名为新文件名。重命名为您处理所有复制和删除。事实上,它只是更改了目录条目,根本没有任何复制。

更新

上述版本从包含要处理的文件名列表的文件中获取输入。对于处理当前目录中所有文件的替代版本,将while 行替换为

while(glob("*")) {

【讨论】:

  • 谢谢你,但它似乎不起作用。我已将脚本保存为 .pl 文件,并使用 +x 标志对其运行 chmod 以使其可执行,并将 CD 放入包含文件的目录中。当我运行脚本时,它只是挂起,没有错误消息,直到我用 ctrl+d 强制退出它。有任何想法吗?再次感谢您的帮助!
  • 将文件名保存到文件中,并将文件名用作脚本的参数。
  • 在更新while 行后完美运行。谢谢!
【解决方案2】:

我能够在网上摸索并想出一个 for 循环来完成这项任务。我使用了cut,它让事情变得简单。这对我有用:

#!/bin/sh

cd "${1:-.}"

for f in *.*; do
    color=`echo "$f" | cut -d'_' -f1`
    name=`echo "$f" | cut -d'_' -f3`
    todir="/dir/work/$color/$name"
    mkdir -p "$todir"
    mv "$f" "$todir"
done

这很好用,我希望它可以帮助其他可能需要根据文件名部分创建目录的人。

shebang 下的第一行使其查看当前工作目录或您将其作为参数传递的目录。

感谢那些参与原始帖子的人。我是脚本新手,所以我需要一段时间才能弄清楚这些东西。不过我喜欢这个网站,它非常有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2023-04-10
    • 2018-09-20
    • 1970-01-01
    相关资源
    最近更新 更多