簡體   English   中英

刪除 bash 腳本中的回車,或者在使用 mv / mkdir 時忽略它

[英]remove carriage return in bash script, or ignore it when using mv / mkdir

我正在嘗試從來自 grep'ing 的變量創建一個目錄,但它一直失敗,告訴我在沒有回車的地方有回車。 我試過 dos2unix,它告訴我這是一個無效文件。 我在 ubuntu 10.10 上創建了帶有 gedit 和 unix 行結尾的腳本。

我還嘗試將 cat 文件的輸出通過管道傳輸到

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

我有點迷失在這一點上。 回車從哪里來?

我認為它來自讀取文件。 在該文件上運行dos2unix

但是,此錯誤消息突出了另一個問題: mv誤解了您提供的內容,因為它認為目標太短了。 我猜你沒有正確引用包含空格的文件路徑。 嘗試用雙引號將整個參數括起來,而不僅僅是它的組成部分。

你可以用一個 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 )並在命令行或 shell 腳本中輸入ruby myscript.rb

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM