如何使用文件名创建文件夹,然后将文件移动到文件夹中?

时间:2010-01-31 16:36:52

标签: python perl bash unix batch-file

我在使用这种命名约定命名的文件夹中有数百个文本文件:

Bandname1 - song1.txt
Bandname1 - song2.txt
Bandname2 - song1.txt
Bandname2 - song2.txt
Bandname2 - song3.txt
Bandname3 - song1.txt
..etc.

我想为不同的乐队创建文件夹,并根据文本文件移动到这些文件夹中。我怎么能用bash,perl或python脚本来实现呢?

7 个答案:

答案 0 :(得分:4)

没有必要使用trim或xargs:

for f in *.txt; do
    band=${f% - *}
    mkdir -p "$band"
    mv "$f" "$band"
done

答案 1 :(得分:2)

使用Perl

use File::Copy move;
while (my $file= <*.txt> ){
    my ($band,$others) = split /\s+-\s+/ ,$file ;
    mkdir $band;
    move($file, $band);
}

答案 2 :(得分:1)

您要求提供特定的脚本,但如果这是用于整理您的音乐,则可能需要查看 EasyTAG 。它具有非常具体和强大的规则,您可以根据需要自定义组织音乐:

alt text http://easytag.sourceforge.net/images/screenshot-gtk2/screenshot_sw_scan_tag.png

这条规则说,“假设我的文件名在结构中”[艺术家] - [专辑标题] / [曲目编号] - [标题]“。然后你可以标记它们,或者将文件移动到任何新模式,或做其他任何事情。

答案 3 :(得分:1)

gregseth 的答案将有效,只需将trim替换为xargs即可。您也可以使用if来消除mkdir -p测试,例如:

for f in *.txt; do
    band=$(echo "$f" | cut -d'-' -f1 | xargs)
    mkdir -p "$band"
    mv "$f" "$band"
done

严格来说,甚至不需要trimxargs,但xargs至少会删除任何额外的格式,因此不会受到影响。

答案 4 :(得分:0)

这个怎么样:

for f in *.txt
do
  band=$(echo "$f" | cut -d'-' -f1 | trim)
  if [ -d "$band" ]
  then
    mkdir "$band"
  fi
  mv "$f" "$band"
done

答案 5 :(得分:0)

这个Python程序假定源文件在data中,并且新目录结构应该在target中(并且它已经存在)。

关键是os.path.walk将遍历data目录结构并为每个文件调用myVisitor

import os
import os.path

sourceDir = "data"
targetDir = "target"

def myVisitor(arg, dirname, names):
    for file in names:
        bandDir = file.split("-")[0]
        newDir = os.path.join(targetDir, bandDir)
        if (not os.path.exists(newDir)):
            os.mkdir(newDir)

        newName = os.path.join(newDir, file)
        oldName = os.path.join(dirname, file)

        os.rename(oldName, newName)

os.path.walk(sourceDir, myVisitor, None)

答案 6 :(得分:-1)

ls |perl -lne'$f=$_; s/(.+?) - [^-]*\.txt/$1/; mkdir unless -d; rename $f, "$_/$f"'