2015-12-21 45 views
1

當我做如何刪除隱藏字符的文件擴展名後,在變量

echo $filename 

我得到

Pew Pew.mp4 

然而,

echo "${#filename}" 

返回19

如何刪除所有字符文件擴展名後?它需要工作,無論文件擴展名是什麼,因爲變量中的文件名不會總是匹配* .mp4

+0

來構建你怎麼知道這些額外的字符文件擴展名的一部分? (如果它們是,你應該把它們扔掉嗎?)無論如何,(1)這個名字中的一些字符實際上是UTF8字符? (請參閱http://stackoverflow.com/a/31009961/2564301),以及(2)如果沒有,最好檢查一下您的硬盤。 – usr2564301

+1

好問題。它們不是名稱中的UTF8字符。當我用$ filename.conf創建一個新文件作爲名稱時,它會生成一個如下所示的文件:Pew Pew.mp4 ?? [23; 0t.conf。我不知道這些角色是什麼,但我不認爲它是我的硬盤。這些是youtube-dl --get-filename返回的文件名稱 – baruch

+0

Ouch - 看起來像一些批量重命名命令跑了一陣子。也許可以用'sed'在第一個非ASCII字符之後剪切掉所有的東西。 – usr2564301

回答

0

您應該嘗試在修復它之前找出爲什麼有這些奇怪的文件。 一旦你知道,你可以重命名文件。
當你只是要重命名文件1,只需要使用命令

mv "Pew Pew.mp4"* "Pew Pew.mp4" 

切斷主完全擴展(與filename=${filename%%.*})不會幫助你,如果你想使用的剝離擴展(MP4或JPG或。 ..)。 編輯: 我認爲OP想要一個解決辦法,所以我給另一個嘗試。 當你有一個擴展的短名單,你可以嘗試

for ext in mpeg mpg jpg avo mov; do 
    for filename in *.${ext}*; do 
     mv "${filename%%.*}.${ext}"* "${filename%%.*}.${ext}" 
    done 
done 

你可以嘗試strings獲得可讀的字符串。

echo "${filename}" | strings | wc 
# Rename file 
    mv "${filename}" "$(echo "${filename}"| strings)" 

編輯: strings給出超過1線作爲結果和不希望的空間。由於Pew Pew裏面有一個空格,我希望所有空格,下劃線和減號位於點的前面。
的NEWNAME可以像

tmpname=$(echo "${filename}"| strings | head -1) 
newname=${tmpname% *} 

# or another way 
newname=$(echo "${filename}"| sed 's/[[:alnum:]_- ]*\.[[:alnum:]]*\).*/\1/') 

# or another (the best?) way (hoping that the first unwanted character is not a space) 
newname="${filename%%[^[:alnum:]\.-_]*}" 
# resulting in 
mv "${filename}" "${filename%%[^[:alnum:]\.-_]*}" 
+0

感謝您的幫助。 echo「$ {filename}」|字符串返回以下兩行:「Pew Pew.mp4」; 「[23;0噸」。我不知道這些額外的文本來自哪裏,但我試圖創建一個名爲「Pew Pew.mp4.conf」的文件。每次運行這些腳本時,$ filename都會包含我正在下載的另一個文件的名稱,並且我正在爲它們中的每一個製作.conf文件。 – baruch

+0

當你通過'head -1'發送輸出時,你將會擁有Pew Pew。 –

+0

我嘗試過,當我試圖命名它「Pew Pew.mp4.conf」時,我仍然得到了「Pew Pew.mp4 .conf」。任何想法爲什麼這個空間顯示? – baruch