2013-01-13 75 views
12

Tôi có một cái gì đó như thế này:Đổi tên tập tin trong nhiều thư mục với tên của thư mục

v_1/file.txt 
v_2/file.txt 
v_3/file.txt 
... 

và tôi muốn đổi tên các tập tin một cái gì đó như thế này:

v_1.txt 
v_2.txt 
v_3.txt 
... 

trong cùng thư mục .

Tôi đoán tôi có thể sử dụng rename nhưng tôi không thể tìm ra cách sử dụng cùng với đổi tên thư mục và tệp cùng một lúc.

Trả lời

19

Kết quả có thể đạt được với một bash vòng lặp for và mv:

for subdir in *; do mv $subdir/file.txt $subdir.txt; done; 

Lưu ý rằng giải pháp trên sẽ không hoạt động nếu tên thư mục chứa không gian. Liên quan link.

Một giải pháp dựa trên ý kiến ​​(mà làm việc cho các thư mục có khoảng trống trong tên cũng):

find . -type d -not -empty -exec echo mv \{\}/file.txt \{\}.txt \; 
+0

có vẻ đủ tốt – giskou

+0

'$ subdir' phải là' "$ subdir" ' và để xóa các thư mục trống ' tìm. -type d -empty -exec rm -rf \ {\} \; ' – giskou

+0

@giskou Nếu bạn thích gõ.Việc đổi tên 's #/file ##' đơn giản hơn rất nhiều, và ở mức trừu tượng đúng. Lặp đi lặp lại cùng một vòng lặp vỏ tất cả cuộc sống của bạn để đổi tên các tập tin được cũ nhanh. – tchrist

1

Seem khá đơn giản với tôi:

$ mkdir /tmp/sandbox 
$ cd /tmp/sandbox 

$ mkdir v_{1,2,3} 
$ touch v_{1,2,3}/file.txt 

$ rename -v 's#/file##' v_{1,2,3}/file.txt 
rename v_1/file.txt v_1.txt 
rename v_2/file.txt v_2.txt 
rename v_3/file.txt v_3.txt 

$ ls -F 
v_1/ v_1.txt v_2/ v_2.txt v_3/ v_3.txt 
+2

các thư mục con khoảng 130 và không chỉ 3: P – giskou

+0

@giskou Tôi không hiểu tại sao lại quan trọng: Tôi chỉ chứng minh rằng kỹ thuật này hoạt động. Số lượng subdirs là không quan trọng, trừ khi bạn nhấn các giới hạn 'xargs', và thậm chí đó là tầm thường vì Perl' rename' sẽ đọc tên tập tin trên stdin. – tchrist

+0

Tôi bash nhiều hơn perl và regexps. Nếu bạn có thể giải thích kỹ thuật của bạn chi tiết ... Tôi thực sự không biết nó làm gì: P – giskou

1

Bạn có thể sử dụng rnm. Lệnh sẽ là:

rnm -fo -dp -1 -ns '/pd0/.txt' -ss '\.txt$' /path/to/the/directory 

-fo ngụ ý chế độ chỉ tệp.

-dp chiều sâu thư mục. -1 làm cho nó đệ quy cho tất cả các thư mục con.

-ns ngụ ý chuỗi tên tức là tên mới của tệp.

/pd0/ là thư mục mẹ ngay lập tức của tệp có thể hoạt động đổi tên.

-ss là chuỗi tìm kiếm (regex). '\.txt$' tìm kiếm regex cho tệp có .txt ở cuối tên tệp.

/path/to/the/directory đây là đường dẫn nơi chứa thư mục v_1, v_2 .... Bạn cũng có thể chuyển các thư mục (v_1, v_2 ...) vào vị trí của đường dẫn thư mục chính. Ví dụ:

#from inside the parent directory 
rnm -fo -dp -1 -ns '/pd0/.txt' -ss '\.txt$' v_* 
Các vấn đề liên quan