3

我正在尝试从来自 grep'ing 的变量创建一个目录,但它一直失败,告诉我有一个回车,而没有。我试过dos2unix,它告诉我这是一个无效文件。我在 ubuntu 10.10 上创建了带有 gedit 和 unix 行尾的脚本。

我还尝试将 cat'd 文件的输出通过管道传输到

tr -d '\r'

那不行。

这是脚本中失败的部分:

ARTIST=`cat read | grep DTITLE | cut -c8- | cut -d"/" -f 1`
ALBUM=`cat read | grep DTITLE | cut -c8- | cut -d"/" -f 2 | awk '{gsub(/^[ \t]+|[\t]+$/,"")};1'`
mkdir $DEST/"$ARTIST"
cd $DEST/"$ARTIST"
mkdir "$ALBUM"
mv $DEST/temp/*.flac $DEST/"$ARTIST"/"$ALBUM"/

我收到的错误:

mv: target `Hard\r' is not a directory

这是它从中提取的文件“读取”:

macmini:~/Dropbox/bin$ cat ~/Desktop/temp/read
210 folk 0d021f02 CD database entry follows (until terminating `.')
# xmcd CD database file
#
# Track frame offsets:
#   150
#   13002
#
# Disc length: 545 seconds
#
# Revision: 0
# Processed by: cddbd v1.5.2PL0 Copyright (c) Steve Scherf et al.
# Submitted via: CDex 1.50Beta7
#
DISCID=0d021f02
DTITLE=Cursive / Art is Hard
DYEAR=2003
DGENRE=Indie
TTITLE0=Art is Hard
TTITLE1=Sinner's Serenade
EXTD= YEAR: 2003
EXTT0=
EXTT1=
PLAYORDER=
.

在这一点上,我有点失落。回车从哪里来?

4

2 回答 2

1

我认为它来自读取文件。dos2unix在该文件上运行。

然而,这个错误信息突出了另一个问题:mv误解了你给它的东西,因为它认为目标太短了。我猜你没有正确引用包含空格的文件路径。尝试将整个论点用双引号括起来,而不仅仅是它的组成部分。

于 2011-04-16T19:09:13.937 回答
0

你可以用一个 awk 脚本来做到这一点

#!/bin/bash   

awk -F"[/=]" 'BEGIN{
    qq="\047"
    DEST="/tmp"
}/DTITLE/{
    ARTIST=$2
    ALBUM=$NF
    gsub(/^[ \t]+|[ \t]+$/,"",ALBUM)
    gsub(/^[ \t]+|[ \t]+$/,"",ARTIST)
    cmd="mkdir "qq DEST"/"ARTIST qq
    print cmd
    #system(cmd)
    cmd="mkdir -p " qq DEST"/"ARTIST  "/" ALBUM qq
    print cmd
    #system(cmd)
    cmd="mv "DEST"/temp/*.flac " qq DEST"/"ARTIST  "/" ALBUM qq
    print cmd
    #system(cmd)
} ' file

要运行它,请保存为 shell 脚本(例如 myscript.sh)并./myscript.sh在命令行中键入

或者您可以使用一种编程语言来处理繁琐的 shell 引用问题,例如 Ruby(1.9+) 脚本

#!/usr/bin/env ruby  
require 'fileutils'
DEST="/tmp"
File.open("file") do |f|
    while not f.eof?
        line = f.gets.chomp
        if line[/DTITLE/]
            line = line.split(/[\/=]/)
            ARTIST=line[1].strip
            ALBUM=line[2].strip
            Dir.mkdir( File.join(DEST, ARTIST) )
            Dir.mkdir( File.join(DEST, ARTIST, ALBUM) )
            Dir.glob( File.join(DEST, "temp", "*.flac") ).each do |file|
                FileUtils.mv ( file, File.join(DEST, ARTIST, ALBUM) )
            end
        end
    end
end

要运行它,另存为(例如 myscript.rb )并ruby myscript.rb在命令行或 shell 脚本中键入。

于 2011-04-17T02:50:15.203 回答