2013-02-15 72 views
2

我剛從服務器上下載了大約600個文件,需要從文件名中刪除最後11個字符(不包括擴展名)。我使用Ubuntu和我正在尋找一個命令來實現這一點。在Linux中刪除10個字符的文件名

一些例子如下:

aarondyne_kh2_13thstruggle_or_1250556383.mus應該被重新命名爲aarondyne_kh2_13thstruggle_or.mus

aarondyne_kh2_darknessofunknow_1250556659.mp3應該被重新命名爲aarondyne_kh2_darknessofunknow.mp3

看來,我這樣做後,有些重複可能存在,但如果命令未能完成並告訴我重複項是什麼,我總是可以手動刪除它們。

回答

3

嘗試使用rename命令。它允許您根據正則表達式來重命名文件:

下面一行應該制定出適合你:會發生

rename 's/_\d+(\.[a-z0-9A-Z]+)$/$1/' * 

以下變化:

aarondyne_kh2_13thstruggle_or_1250556383.mus renamed as aarondyne_kh2_13thstruggle_or.mus 
aarondyne_kh2_darknessofunknow_1250556659.mp3 renamed as aarondyne_kh2_darknessofunknow.mp3 

您可以檢查行動rename將通過指定-n標誌,這樣做:

rename -n 's/_\d+(\.[a-z0-9A-Z]+)$/$1/' * 

有關如何使用rename只需打開通過手冊頁的詳細信息:man rename

+4

注意:我的重命名版本(stock fedora 18!)沒有標誌''-n'',並且工作原理不同。特別的是,它不支持正則表達式,而只支持宏。 – 2013-02-15 16:37:48

+0

@JonasWielicki感謝您的注意。我在Ubuntu 12.10桌面版上測試了答案,所以至少應該解決最初的問題。 – TimWolla 2013-02-15 16:39:02

+1

非常感謝。這幫助了我! – 2013-02-15 16:49:32

1

不是最漂亮的,但很簡單:

echo "$filename" | sed -e 's!\(.*\)...........\(\.[^.]*\)!\1\2!' 

你仍然需要編寫腳本的其餘部分,但它是非常簡單的。

+0

有趣。我知道例如'sed -e s/anton/berta'用'berta'替代'anton',用's'代替'substitute'。你的語法錯過了正斜槓! '[^。]'是什麼?是否排除所有字符?我知道'man sed' .. – Timo 2017-11-27 09:45:30

+0

ohh,'!'現在是分隔符,因爲它對文件名更好,所以你搜索'...'並且用什麼都替換('\ 1 \ 2')? – Timo 2017-11-27 10:00:43

+0

加上一個簡單的設計。你怎麼知道從最後開始沒有擴展? – Timo 2017-12-11 10:13:48

0

一條路可走:

你得到你的文件,每行一個列表(由ls可能),則:

ls....|awk '{o=$0;sub(/_[^_.]*\./,".",$0);print "mv "o" "$0}' 

這將打印mv a b命令

kent$ echo "aarondyne_kh2_13thstruggle_or_1250556383.mus"|awk '{o=$0;sub(/_[^_.]*\./,".",$0);print "mv "o" "$0}' 
mv aarondyne_kh2_13thstruggle_or_1250556383.mus aarondyne_kh2_13thstruggle_or.mus 

執行,只是管它|sh

我假設有你的文件名中沒有空間。

+1

有比獲得所有文件的名字更安全的方法,而不是解析'ls'的輸出;請參閱http://mywiki.wooledge.org/ParsingLs – chepner 2013-02-15 16:42:57

1
find . -type f -exec sh -c 'mv {} `echo -n {} | sed -E -e "s/[^/]{10}(\\.[^\\.]+)?$/\\1/"`' ";" 
+0

我喜歡簡短的語法,所以加上1.你能解釋你做了什麼嗎?你替換了所有的字符,但不是。 ('[^ \。]')沒有任何東西('\\ 1')? sed如何知道從最後開始但不包括擴展名? – Timo 2017-12-11 10:09:18

0

此腳本假設每個文件只有一個擴展名。例如,它會將「foo.something.mus」重命名爲「foo.mus」。要保留所有擴展名,請從循環體的第一行中刪除一個散列標記(#)。它還假定每個文件名的基數至少有12個字符,因此刪除11時不會留下空的名稱。

for f in *; do 
    ext=${f##*.} 
    new_f=${base%???????????.$ext} 
    if [ -f "$new_f" ]; then 
     echo "Will not rename $f, $new_f already exists" >&2 
    else 
     mv "$f" "$new_f" 
    fi 
done 
相關問題