簡體   English   中英

Linux bash Shell腳本-文件名中的空格

[英]Linux bash shell scripts - spaces in file names

自從我做了很多bash腳本編寫以來已經很長時間了。

這是一個bash腳本,用於通過刪除第一個句點定界符之前的所有內容來復制和重命名文件:

#!/bin/bash

mkdir fullname
mv *.audio fullname
cd fullname

for x in * ;
do
  cp $x ../`echo $x | cut -d "." -f 2-`
done

cd ..
ls

它適用於沒有嵌入空格的文件名,但不適用於有空格的文件名。

如何更改代碼以修復此簡單的Linux bash腳本? 任何其他出於其他原因改進代碼的建議也將受到歡迎。

示例文件名,有些帶有嵌入空格,有些沒有(來自鏈接)

http://www.homenetvideo.com/demo/index.php?/Radio%20%28VLC%29

Ambient.A6.SOMA Space Station.audio
Blues.B9.Blues Radio U.K.audio
Classical.K3.Radio Stephansdom - Vienna.audio
College.CI.KDVS U of California, Davis.audio
Country.Q1.K-FROG.audio
Easy.G4.WNYU.audio
Eclectic.M2.XPN.audio
Electronica.E2.Rinse.audio
Folk.F1.Radionomy.audio
Hiphop.H1.NPR.audio
Indie.I4.WAUG.audio
Jazz.J6.KCSM.audio
Latin.L3.Mega.audio
Misc.X7.Gaydio.audio
News.N9.KQED.audio
Oldies.O1.Lonestar.audio
OldTime.Y1.Roswell.audio
Progressive.P1.Aural Moon.audio
Rock.R8.WXRT.audio
Scanner.Z3.Montreal.audio
Soul.S1.181.FM.audio
Talk.T2.TWiT.audio
World.W3.Persian.audio

http://lh5.googleusercontent.com/-QjLEiAtT4cw/U98_UFcWvvI/AAAAAAAABv8/gyPhbg8s7Bw/w681-h373-no/homenet-radio.png

每當處理可能在其中帶有空格的文件名時,都必須將它們引用為"$x"而不是$x 這就是導致cp命令失敗的原因。

您的echo命令也是有問題的。 盡管echo對於簡單的空格做了正確的事情-它會將名為ABC的文件作為ABC -如果名稱中包含多個連續的空格或不是簡單空格字符的空白,它將仍然失敗。

與其將文件名傳遞給外部程序進行處理(這總是需要通過空格敵對的命令行來進行處理),不如使用${x%%foo} bash內置函數進行字符串操作,例如${x%%foo}${x#bar}和類似功能。 手冊頁在“參數擴展”下描述了它們。

這是我的建議:

#!/bin/bash
shopt -s nullglob
mkdir fullname
mv *.audio fullname
(
  cd fullname || exit
  for x in *; do
    cp "$x" "../${x#*.}"
  done
)
ls
  • 如果沒有文件匹配,則nullglob防止*出現。 只是可選的。
  • ()召喚一個子Shell,使您不必再切換回另一個目錄。
  • || exit 如果cd無法更改目錄,則|| exit終止子外殼。
  • ${x#*.}刪除<first>. $x擴展它。

暫無
暫無

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

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