簡體   English   中英

使用bash腳本將下划線替換為空格

[英]Replace underscores to whitespaces using bash script

如何使用Bash Script在多個文件名中用空格替換所有下划線字符? 使用此代碼,我們可以將下划線替換為破折號。 但是它如何與空白一起使用?

for i in *.mp3;
do x=$(echo $i | grep '_' | sed 's/_/\-/g');
if [ -n "$x" ];
then mv $i $x;
fi;
done;

謝謝!

應該這樣做:

for i in *.mp3; do
    [[ "$i" = *_* ]] && mv -nv -- "$i" "${i//_/ }"
done
  • 測試[[ "$i" = *_* ]]測試,如果文件名包含任何下划線,如果這樣做,將mv的文件,其中"${i//_/ }"擴展到i ,所有的下划線有被空格代替(請參閱shell參數擴展 )。
  • mv的選項-n表示no clobber :不會覆蓋任何存在的文件(相當安全)。 可選的
  • 選項-vmvverbose :會說出它在做什么(如果您想看看正在發生什么)。 非常可選
  • --是在這里告訴mv參數將從此處開始。 這始終是一個好習慣,就像文件名以-開頭時, mv會嘗試將其解釋為選項,並且腳本將失敗。 很好的做法

另一條評論:使用glob時(例如, for i in *.mp3 ),設置shopt -s nullglobshopt -s failglob總是很好。 如果沒有文件與模式匹配,前者將使*.mp3擴展為*.mp3 (因此不會執行循環),后者將顯式引發錯誤。 如果沒有這些選項,如果不存在與*.mp3匹配的文件,則將使用i的逐字值*.mp3執行循環內的代碼,這可能會導致問題。 (好吧,由於守護[[ "$i" = *_* ]] ,在這里不會有任何問題,但是始終使用這兩個選項是一個好習慣)。

希望這可以幫助!

您的腳本使用空格失敗的原因是,傳遞給mv時,文件名被視為多個參數。 您需要引用文件名,以便將每個文件名視為一個單獨的文件。 使用以下命令更新腳本中的相關行:

mv "$i" "$x"  
# where $i is your original filename, and $x is the new name

順便說一句,如果您安裝了重命名命令perl版本,則可以跳過該腳本並使用以下命令完成相同的操作:

rename 's/_/ /' *.mp3

或者,如果您擁有更經典的rename命令

rename "_" " " *.mp3

使用tr

tr '_' ' ' <file1 >file2

暫無
暫無

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

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