2016-07-23 15 views
0

ich dieses Skript online gefunden, die ich zu bearbeiten bin versucht, aber wie ich es bin Tests kann ich sehen, dass es eine Reihe von Fehlern für alle Dateien ausspucken werde ich habe mit Leerzeichen. Dies ist die Art von Fehlerprotokoll I am Terminal Fenster:Bash-Skript können keine Leerzeichen in Dateinamen umgehen

Skipping 1-03 as ./mp3/basename "$input_file" .wav.mp3 exists. 
Skipping The as ./mp3/basename "$input_file" .wav.mp3 exists. 
Skipping power, as ./mp3/basename "$input_file" .wav.mp3 exists. 

Und das ist das Skript:

#!/bin/bash 

# Title:  wav_to_mp3.sh 
# Purpose:  Converts all WAV files present in the folder to MP3 
# Author:  Karthic Raghupathi, IVR Technology Group LLC 
# Last Revised: 2014.01.28 

# references 
sox="/usr/local/bin/sox" 
sox_options="-S" 

# variables 
source_folder="${1:-.}" 
destination_folder="${source_folder}/mp3" 
environment="${2:-DEVELOPMENT}" 

# check to see if an environment flag was supplied 
if [ $environment = "PRODUCTION" ] || [ $environment = "production" ]; then 
    sox="/usr/bin/sox" 
    environment="PRODUCTION" 
fi 

# print all params so user can see 
clear 
echo "Script operating using the following settings and parameters....." 
echo "" 
echo "which SoX: ${sox}" 
echo "SoX options: ${sox_options}" 
echo "Environment: ${environment}" 
echo "Source: ${source_folder}" 
echo "Destination: ${destination_folder}" 
echo "" 

read -e -p "Do you wish to proceed? (y/n) : " confirm 

if [ $confirm = "N" ] || [ $confirm = "n" ]; then 
    exit 
fi 

# create destination if it does not exist 
if [ ! -d "${destination_folder}" ]; then 
    mkdir -p "${destination_folder}" 
fi 

# loop through all files in folder and convert them to 
for input_file in $(ls -1 $1 | grep .wav) 
do 
    name_part=`basename "$input_file" .wav` 
    output_file="$name_part.mp3" 

    # create mp3 if file does not exist 
    if [ ! -f "$destination_folder/$output_file" ]; then 
     $sox $sox_options "${source_folder}/$input_file" "$destination_folder/$output_file" 
    else 
     echo "Skipping ${input_file} as $destination_folder/$output_file exists." 
    fi 


done 

Ich weiß, ich soll es die Leerzeichen machen zu entkommen, aber ich kann nicht herausfinden, wie. Ich habe versucht, einige Zitate hier und da zu ändern, aber ich breche es gerade.

BTW, wenn jemand so freundlich sein würde als ein gutes Tutorial zu dem Link zu lernen, wie man Bash-Skripte auf Mac OS (oder Unix) zu machen, das wäre sehr geschätzt. Ich kenne bereits ein bisschen Webprogrammierung, also bin ich kein komplettes n00b, aber trotzdem habe ich Probleme beim Erstellen sehr einfacher Skripte und ich würde gerne selbständig lernen, ohne ständig das Internet um Hilfe zu bugsieren.

Antwort

-3

Sie Leerzeichen können durch Einfügen eines umgekehrten Schrägstrichs vor dem Leerzeichen entfernt werden.

Wechsel:

This file name 

An:

This\ file\ name 

Es könnte eine Idee sein, eine Funktion zu schreiben, dies für Sie tun, durchläuft jedes Zeichen in einer Zeichenfolge und das Hinzufügen eines \ caracter vor irgendwelche Räume. Auf diese Weise müssen Sie sich keine Gedanken darüber machen, wie Sie die Dateinamen vorformatieren und jeden einzelnen Speicherbereich verlassen - führen Sie einfach den Dateinamen über die Funktion aus und erfassen Sie das Ergebnis.

+0

Ok danke! Ich werde versuchen, zu sehen, wie ich eine Funktion für das machen kann, vielen Dank für die schnelle Antwort :) – Marw

+0

Keine Sorge - Sie können diesen Kommentar hilfreich: http://tldp.org/LDP/abs/html/string-manipulation. html – Nunchy

+1

Downvote: Dies ist das Symptom beheben, nicht das Problem. http://mywiki.wooled.org/ParsingLs – tripleee

1

Das ist falsch:

for input_file in $(ls -1 $1 | grep .wav) 

Siehe here warum. Auch innerhalb $ 1, versuchen, dies zu sehen, dass Dateinamen mit Leerzeichen Mühe geben:

for i in $(ls -1 | grep wav); do echo $i; done 

Versuchen Sie stattdessen:

for input_file in $1/*.wav