2010-12-22 42 views
37

Tôi có nhiều tệp có đuôi .txt. Làm thế nào để loại bỏ phần mở rộng .txt cho nhiều tập tin trong linux?Linux: xóa phần mở rộng tệp cho nhiều tệp

tôi thấy rằng

rename .old .new *.old 

thay .old mở rộng của .new

Ngoài ra tôi muốn làm điều này cho các tập tin trong thư mục con.

Trả lời

59

rename là hơi nguy hiểm, vì theo trang hướng dẫn của nó:

đổi tên sẽ đổi tên các tập tin định bằng cách thay thế xuất hiện đầu tiên của ...

Sẽ vui vẻ làm điều sai với tên tệp như c.txt.parser.y.

Dưới đây là một giải pháp sử dụng findbash:

find -type f -name '*.txt' | while read f; do mv "$f" "${f%.txt}"; done 

Hãy ghi nhớ rằng điều này sẽ phá vỡ nếu một tên tập tin chứa một dòng mới (hiếm, nhưng không phải bất khả thi).

Nếu bạn có GNU tìm thấy, đây là một giải pháp vững chắc hơn:

find -type f -name '*.txt' -print0 | while read -d $'\0' f; do mv "$f" "${f%.txt}"; done 
+1

Đó là sự thật về phiên bản 'util-linux-ng' của' rename', nhưng phiên bản script Perl có thể làm 'đổi tên '/ .txt $ //' * .txt' –

+0

cho tôi đổi tên/.txt $ // '* .txt không hoạt động – rp101

+1

bạn đang thiếu "." đối với vị trí mà bạn muốn chạy. có thể đây là biến thể tìm kiếm osx của tôi hoặc đường dẫn của tôi không được đặt chính xác – bgs

10

Bạn có thể chuyển một cách rõ ràng vào một chuỗi trống làm đối số.

rename .old '' *.old

Và với thư mục con, find . -type d -exec rename .old '' {}/*.old \;. {} là mục thay thế cho mục nhập được tìm thấy với find\; chấm dứt danh sách đối với lệnh được đưa ra sau -exec.

1

Đối với các thư mục con:

for i in `find myfolder -type d`; do 
    rename .old .new $i/*.old 
done 
+2

Điều này có thể gây ra vấn đề nếu có một tên thư mục với một không gian trong đó. – robert

15

tôi sử dụng này:

find ./ -name "*.old" -exec sh -c 'mv $0 `basename "$0" .old`.new' '{}' \; 
+0

cảm ơn bạn, tôi không biết cú pháp này, và nó cũng hoạt động trên MacOSX (thiếu 'đổi tên gốc '). – Utopik

+0

hoạt động tuyệt vời này dưới Windows Git Bash, cảm ơn! – RaptoX

+0

Bạn nên thêm tên dirname trong trường hợp đích nằm trong thư mục con: tìm ./ -name "* .old" -exec sh -c 'mv $ 0 'dirname" $ ​​0 "'/'tên cơ sở" $ 0 ".old' .Mới' '{}' \; –

13

Phiên bản Perl của đổi tên có thể loại bỏ một phần mở rộng như sau:

rename 's/\.txt$//' *.txt 

Điều này có thể được kết hợp với tìm để cũng làm các thư mục con.

1

Trong cá, bạn có thể làm

for file in *.old 
     touch (basename "$file" .old).new 
end 
3

Trong trường hợp nó giúp, đây là cách tôi làm điều đó với zsh:

for f in ./**/*.old; do 
    mv "${f}" "${f%.old}" 
done 

Các ${x%pattern} xây dựng trong zsh loại bỏ sự xuất hiện ngắn nhất pattern tại kết thúc của $x.Ở đây nó là trừu tượng như một chức năng:

function chgext() { 
    local srcext=".old" 
    local dstext="" 
    local dir="." 

    [[ "$#" -ge 1 ]] && srcext="$1" 
    [[ "$#" -gt 2 ]] && dstext="$2" dir="$3" || dir="${2:-.}" 

    local bname='' 
    for f in "${dir}"/**/*"${srcext}"; do 
     bname="${f%${srcext}}" 
     echo "${bname}{${srcext} → ${dstext}}" 
     mv "${f}" "${bname}${dstext}" 
    done 
} 

Cách sử dụng:

chgext 
chgext src 
chgext src dir 
chgext src dst dir 

Where `src` is the extension to find (default: ".old") 
     `dst` is the extension to replace with (default: "") 
     `dir` is the directory to act on (default: ".") 
Các vấn đề liên quan