根据文件名称标记

时间:2015-12-15 19:26:42

标签: linux bash automation copying

我希望编写一个脚本来从目录中移动文件:

/家庭/ MYDIR /

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

red_office_mike_2015_montreal_546968.ext

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

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

/目录/工作/ $颜色/ $名称

然后验证文件是否已成功复制,并删除原始文件。

如果脚本创建了目录,如果它还不存在,我也会喜欢它。

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

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

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

这不是一个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("*")) {

答案 1 :(得分:0)

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

感谢那些在原帖上插话的人。我是脚本新手,所以我需要一段时间来解决这些问题。我喜欢这个网站,它非常有帮助!