2009-07-30 221 views
1

我需要刪除的擴展名 「.tex」:子目錄刪除擴展

./1-aoeeu/1.tex 
./2-thst/2.tex 
./3-oeu/3.tex 
./4-uoueou/4.tex 
./5-aaa/5.tex 
./6-oeua/6.tex 
./7-oue/7.tex 

請下面一些工具做到這一點:

  1. 桑達並找到

  2. 紅寶石

  3. Python

我可憐的嘗試:

$find . -maxdepth 2 -name "*.tex" -ok mv `sed '[email protected]@@g' {}` {} + 

回答

4

Python腳本做同樣的:

import os.path, shutil 

def remove_ext(arg, dirname, fnames): 
    argfiles = (os.path.join(dirname, f) for f in fnames if f.endswith(arg)) 
    for f in argfiles: 
     shutil.move(f, f[:-len(arg)]) 

os.path.walk('/some/path', remove_ext, '.tex') 
1

的一種方式,不一定是最快的(但至少最快的開發):

 
    pax> for i in *.c */*.c */*/*.c ; do 
    ...> j=$(echo "$i" | sed 's/\.c$//') 
    ...> echo mv "$i" "$j" 
    ...> done 

因爲你的maxdepth是2,所以它是等效的。腳本只是在迴應mv命令(用於測試目的)和處理C文件(因爲我沒有tex文件進行測試)。

或者,您可以用找到的所有因而功率:

 
    pax> find . -maxdepth 2 -name '*.tex' | while read line ; do 
    ...> j=$(echo "$line" | sed 's/\.tex$//') 
    ...> mv "$line" "$j" 
    ...> done 

+0

+1,對於「讀線」,我搞亂了'-exec` – nik 2009-07-30 06:20:02

+0

同意。 「find ... | while read」是我最喜歡的bash單線模板之一。 – Cascabel 2009-07-30 14:54:54

0

使用bash,從基本目錄findmv

for i in $(find . -type f -maxdepth 2 -name "*.tex"); 
do 
    mv $i $(echo "$i" | sed 's|.tex$||'); 
done 

基於這裏其他的答案變2

find . -type f -maxdepth 2 -name "*.tex" | while read line; 
do 
    mv "$line" "${line%%.tex}"; 
done 

PS:我沒有得到這個角色有關轉義 '.' 由pax ...

0

「在我的」 使用可能會導致 「太多的參數」 errrors

更好的方法是將管道找到下一個過程。

例子:

find . -type f -name "*.tex" | while read file 
do 
    mv $file ${file%%tex}g 
done 

(注:慣於處理文件用空格)

0

有一個很好的Perl腳本重命名附帶的一些發行,否則你可以找到它在網絡上。 (我不確定它在哪裏正式居住,但是this is it)。檢查您的重命名是否由Larry Wall撰寫(作者部分man rename)。它可以讓你做這樣的事情:

find . [-maxdepth 2] -name "*.tex" -exec rename 's/\.tex//' '{}' \; 

使用-exec是最簡單的,因爲在這裏,只有一個執行操作,並且它不是調用重命名多次太貴了。如果你需要做多件事情,用「而讀」的形式:

find . [-maxdepth 2] -name "*.tex" | while read texfile; do rename 's/\.tex//' $texfile; done 

如果你有什麼要一次調用:

find . [-maxdepth 2] -name "*.tex" | xargs rename 's/\.tex//' 

這最後一個使重命名清楚是多麼有用 - 如果所有東西都在同一個地方,那麼你有一個快速的正則表達式重命名器。