Làm cách nào tôi có thể di chuyển các thư mục chứa tệp có phần mở rộng cụ thể sang thư mục đích?


3

Nhiều năm trước, tôi đã chuyển đổi một phần các tệp của mình sang định dạng tùy ý với một phần mở rộng cụ thể. tôi không còn mong muốn có chúng ở định dạng này và tôi muốn bắt đầu quá trình thay thế chúng vì chuyển đổi không phải là một giải pháp thích hợp. thật không may, chúng được trộn trong các thư mục riêng biệt của cùng một thư mục gốc với các tệp ở định dạng hiện tại của một tiện ích mở rộng khác. Tôi cảm thấy nó sẽ làm cho quá trình này dễ dàng hơn nếu tôi di chuyển mọi thư mục chứa tệp có định dạng không mong muốn sang một thư mục gốc riêng biệt. Các tệp được lưu trữ trên máy chủ Linux và được chia sẻ qua samba. Làm thế nào tôi có thể làm điều này với một vài lệnh hoặc một kịch bản? Tôi mở cho các đề nghị khác là tốt. Tôi muốn tránh thời gian chỉnh sửa các tập tin văn bản. Cuối cùng, tôi muốn một lệnh tạo ra một danh sách các đường dẫn đầy đủ cho các thư mục, được sắp xếp theo số cấp sẽ là một liên lạc tốt đẹp. Một danh sách tất cả các tập tin rõ ràng không phải là những gì tôi đang tìm kiếm.

Câu trả lời:


2

tìm thấy . -type f | sed "s # ^. # $ (pwd) #"

trả về các đường dẫn đầy đủ cho tất cả các tệp + hàng đầu / khi chạy ở gốc, bạn có thể chuyển nó thành grep và khớp với phần mở rộng theo sau và endline

thả nó trong một tệp văn bản để thao tác

bây giờ bạn có thể đếm / 's trong một dòng và tách tên tệp ra khỏi cuối và mv $ line thành / adir / filename

tất cả điều này có thể nằm trong một tập lệnh bash duy nhất ... tôi không đủ giỏi trong việc viết kịch bản bash để biến nó thành một oneliner nhưng điều này giúp bạn đi gần hết. bạn có thể muốn coi chừng bị chặn tập tin nếu bạn làm điều này mặc dù.

chỉ là tôi sẽ xử lý nó như thế nào

từ ĐÂY XUỐNG MỚI

vì rõ ràng công việc của tôi là viết cho bạn một kịch bản đầy đủ chức năng vì bạn không thể đọc các faq trực tuyến hoặc trả lời khi được hỏi theo cách nào nó thất bại:

tìm thấy . -type f | sed "s # ^. # $ (pwd) #" | grep '.xml'> test.txt  
./atest.sh> test2.txt  

----atest.sh bắt đầu ----  
#! / bin / bash  
trong khi đọc dòng  
làm  
dòng tên $  
làm xong 

Bạn còn cần kịch bản nào nữa không ?? bởi vì tôi thực sự không có gì tốt hơn để làm

đầu ra từ tập lệnh đó chỉ là tên thư mục chứa các tệp kết thúc bằng .xml hoặc các thư mục kết thúc bằng .xml


Điều này đã không thực sự làm việc cho tôi. nó rất không đầy đủ và có vẻ như tôi đã có thể tái tạo cùng một đầu ra (không chính xác) mà không liên quan đến sed.
Joshua K

1
sau đó bạn thêm loại bỏ trùng lặp
RobotHumans

Tôi đã có thể thêm loại bỏ trùng lặp bằng cách sử dụng lệnh uniq. vì kết quả tìm thấy tất cả các dòng trùng lặp đều liền kề nên '' 'uniq' '' làm việc cho tôi.
Joshua K

2

Các NGUỒN nên là thư mục nhất trên bạn đang tìm kiếm. Nếu các tệp được lưu trữ trong toàn bộ hệ thống tệp của bạn thì SOURCE phải là chính hệ thống tệp.

find ~/SOURCE -name '*.YOUR_EXTENSION' -exec mv {} ~/DESTINATION \;

Đổi tên chúng như thế này:

$ rename -v 's/\.YOUR_EXTENSION$/\.NEW_EXTENSION/' *.YOUR_EXTENSION

Sẽ là một ý tưởng tốt khi chạy -ntùy chọn này với tùy chọn thay vì -vtùy chọn TRƯỚC KHI bạn thực sự muốn đổi tên, vì -ntùy chọn sẽ chỉ chạy mô phỏng và cung cấp cho bạn kết quả của mô phỏng đó.


Ok, đây vẫn không phải là điều tôi muốn, tuy nhiên bạn có thể đưa tôi đến gần hơn một chút và có lẽ có thể cung cấp một bước trung gian. Vấn đề với giải pháp của bạn là nó vẫn đang xử lý việc trình bày đầu ra của một danh sách các tệp. Thay vào đó tôi muốn xuất ra một danh sách các thư mục chứa tệp. Với ví dụ của bạn, tôi có thể sử dụng "dirname" để lấy danh sách các thư mục, nhưng mỗi thư mục được liệt kê một lần cho mỗi tệp. Có hàng chục ngàn tệp và hàng trăm thư mục. Tôi chỉ cần các thư mục.
Joshua K

1
@ Good Time Tribe ahh, tôi hiểu rồi. Tôi nghĩ rằng bạn có thể chỉ cần thêm /*/vào trước .YOUR_EXTENSIONlệnh find mà tôi đã đưa cho bạn để lệnh trông giống nhưfind ~/SOURCE -name '/*/*.YOUR_EXTENSION' -exec mv {} ~/DESTINATION \;
ubiquibacon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.