2016-07-23 86 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脚本,那将是非常感谢。我已经知道了一些网络编程,所以我不是一个完整的n00b,但仍然,我无法创建非常简单的脚本,我想单独学习,而不需要经常窃听互联网寻求帮助:)

回答

-3

你可以通过在空格前插入反斜杠字符来转义空格。

变化:

This file name 

要:

This\ file\ name 

这可能是一个想法,写一个函数来为你做这个,通过在一个字符串中的每个字符迭代,并添加前\卡拉科特任何空间。这样您就不必担心格式化文件名和转义每个空间 - 只需通过函数运行文件名并捕获结果即可。

+0

好,谢谢!我会试着看看我可以怎样做一个函数,谢谢你的快速回复:) – 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