2016-07-23 7 views
0

私はこのスクリプトをオンラインで見つけましたが、編集しようとしていますが、テストしているので、すべてのファイルに対してエラーが出ることがわかりますスペースがある。これは私がターミナルウィンドウに乗るエラーログの一種である:bashスクリプトでファイル名の空白を処理できない

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. 

そして、これはスクリプトです:

#!/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 

私は私はそれが空白文字をエスケープ作りになってるけど、私方法を理解することはできません。私はここでいくつかの引用符を変更しようとしましたが、私はただそれを壊しています。

誰かが、Mac OS(またはUnix)上でbashスクリプトを作成する方法を学ぶための良いチュートリアルをリンクするのに親切であれば、それは大歓迎です。私はすでに少しのWebプログラミングを知っているので、完全なn00bではありませんが、それでも簡単なスクリプトを作成するのに問題があります。インターネットを手伝ってもらうことなく、独立して学びたいと思っています:)

答えて

-3

You空白文字の前にバックスラッシュ文字を挿入して空白文字を逃げることができます。

変更:

This file name 

へ:

This\ file\ name 

文字列の各文字を反復処理と\ caracter前を追加して、あなたのためにこれを行う関数を書くことかもしれません任意のスペース。そうすれば、ファイル名を事前にフォーマットしたり、個々のスペースをエスケープすることを心配する必要はありません。関数を使ってファイル名を実行し、結果をキャプチャするだけです。

+0

[OK]を感謝を!私は、そのための関数を作ることができるかどうかを調べるつもりです。クイック返信のためにありがとう:) – Marw

+0

心配する必要はありません - これは便利かもしれません:http://tldp.org/LDP/abs/html/string-manipulation。 html – Nunchy

+1

Downvote:これは問題ではなく症状を修正しています。 http://mywiki.wooledge.org/ParsingLs – tripleee

1

これは間違っている:

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

here理由を参照してください。また、$ 1の内部に、スペースを含むファイル名はトラブルを与えることを確認するために、これを試してみてください。

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

代わりにこれを試してみてください:

for input_file in $1/*.wav 
関連する問題