удалить возврат каретки в скрипте bash или игнорировать его при использовании mv / mkdir - PullRequest
3 голосов
/ 16 апреля 2011

Эй, ребята, я пытаюсь создать каталог из переменной, которая приходит из 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

вот файл "read", из которого он извлекает:

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=
.

Я немного растерялся на этом этапе. откуда идет возврат каретки?

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

Я думаю, что это из прочитанного файла. Запустите dos2unix для этого файла.

Однако это сообщение об ошибке подчеркивает еще одну проблему: mv неправильно истолковывает то, что вы ему даете, потому что то, что он считает целью, слишком короткое. Я предполагаю, что вы не цитируете пути к файлам, содержащие пробелы правильно. Попробуйте заключить весь аргумент в двойные кавычки, а не просто его компоненты.

0 голосов
/ 17 апреля 2011

Вы можете сделать это с помощью одного сценария 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

Чтобы запустить его, сохраните его как сценарий оболочки (например, myscript.sh) и введите ./myscript.sh в командной строке

Или вы можете использовать язык программирования, который решает громоздкие проблемы с цитированием оболочки, например скрипт 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 вкомандной строки или внутри сценария оболочки.

...