[英]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
:不會覆蓋任何存在的文件(相當安全)。 可選的 。 -v
到mv
是verbose
:會說出它在做什么(如果您想看看正在發生什么)。 非常可選 。 --
是在這里告訴mv
參數將從此處開始。 這始終是一個好習慣,就像文件名以-
開頭時, mv
會嘗試將其解釋為選項,並且腳本將失敗。 很好的做法 。 另一條評論:使用glob時(例如, for i in *.mp3
),設置shopt -s nullglob
或shopt -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.