繁体   English   中英

根据文件名标记将文件移动到其他目录

[英]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目录(如果尚不存在)的话,我也很喜欢。

因此,总而言之,我需要一个脚本来根据下划线分隔的标记移动文件,如果尚不存在to目录,请创建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下方的第一行将其显示为使其可以查看当前工作目录或您将其作为参数传递的目录。

感谢那些参与原始帖子的人。 我是脚本的新手,所以花了我一段时间才能弄清楚这些内容。 我喜欢这个网站,但超级有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM