根据文件名标记将文件移动到不同的目录

Move files to different directories based on file name tokens

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

/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 脚本。我给出的变量是通用的,我会在脚本中加入一些其他的东西,我只是在寻求构建骨架的帮助。

在此先感谢您的帮助!

它不是 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("*")) {

我能够在网上摸索并想出一个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 下的第一行让它查看当前工作目录或您作为参数传递给它的目录。

感谢那些对原作提出意见的人 post。我是脚本新手,所以我花了一些时间来弄清楚这些东西。不过我喜欢这个网站,它非常有用!