根据文件名标记将文件移动到不同的目录
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。我是脚本新手,所以我花了一些时间来弄清楚这些东西。不过我喜欢这个网站,它非常有用!
我正在寻找一个脚本来从目录中移动文件:
/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。我是脚本新手,所以我花了一些时间来弄清楚这些东西。不过我喜欢这个网站,它非常有用!