我在使用这种命名约定命名的文件夹中有数百个文本文件:
Bandname1 - song1.txt
Bandname1 - song2.txt
Bandname2 - song1.txt
Bandname2 - song2.txt
Bandname2 - song3.txt
Bandname3 - song1.txt
..etc.
我想为不同的乐队创建文件夹,并根据文本文件移动到这些文件夹中。我怎么能用bash,perl或python脚本来实现呢?
答案 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
严格来说,甚至不需要trim
或xargs
,但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"'