Shell script để di chuyển tất cả các tệp từ thư mục con sang thư mục mẹ


47

Tôi có rất nhiều thư mục trong thư mục A. Tôi muốn di chuyển các tập tin từ tất cả các thư mục đến A.

Hoặc là

Tôi muốn cắt tất cả các tệp từ thư mục con và dán chúng vào thư mục cha.

Làm thế nào để làm điều đó?


1
Tôi chưa thực sự kiểm tra điều này là hoàn hảo hay bất cứ điều gì, nhưng bạn đã thử chỉ cần nhập lệnh này từ Thư mục A trong một thiết bị đầu cuối : mv */* .?
Marty Fried

Bạn có chắc chắn không có tên tập tin trùng lặp?
jippie

mv */* .sẽ không di chuyển tệp từ thư mục con của thư mục con.
Rahul Virpara

@jippie yep, không có tên trùng lặp
Rahul Virpara

Câu trả lời:


81

Tới Athư mục của bạn và chạy

find . -mindepth 2 -type f -print -exec mv {} . \;

có nghĩa là "tìm tất cả các tệp trong thư mục này và các thư mục con của nó và thực thi mv với thư mục đích. cho mỗi tệp được tìm thấy để di chuyển chúng đến thư mục hiện tại.


1
nó cũng cố gắng di chuyển các tập tin đã có trong thư mục mẹ.
Rahul Virpara

virpara: bây giờ phiên bản này của bạn quên tất cả các tệp trong thư mục .dot. Thay đổi nó với -mindepth 2 thay vào đó để ngăn chặn các cảnh báo.
Tuminoid

1
Với GNU, findbạn có thể thanh lịch hơn một chút và không sinh ra một mvquy trình cho mỗi tệp:find A -mindepth 2 -type f -exec mv -t A \{\} +
David Foerster

David, phiên bản của bạn hoạt động cho đến khi bạn đạt giới hạn độ dài dòng lệnh tối đa, điều đó không khó để đưa ra cách tìm ra các đường dẫn, đặc biệt là trong trường hợp bạn gọi nó từ thư mục khác ngoài A, như trong ví dụ của bạn.
Tuminoid

9
Điều này rất nguy hiểm. nếu bạn có các tệp có cùng tên tệp trong các thư mục con khác nhau, bạn sẽ ghi đè lên tất cả các tệp này với lần tìm cuối cùng. Tốt hơn nên sử dụng mv với --backup = được đánh số:find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
pLumo

4

Vâng, bạn có thể tạo một tệp và đặt tên là "cutme" (để tạo một tệp có tên cutme trong loại thiết bị đầu cuối nano cutme. Để lưu tệp, nhấn CTRL + X, sau đó nhấn ENTER.) Và dán đoạn mã sau vào đó giả sử:

  1. Bạn muốn làm điều này một cách đệ quy (Trong các thư mục con và thư mục con của các thư mục con đó)
  2. Bạn muốn bỏ qua việc di chuyển tệp tập lệnh
  3. Bạn có quyền di chuyển các tập tin trong thư mục đó
  4. Các tệp có thể hoặc không bao gồm khoảng trắng trong tên của chúng

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Lưu ý tên cutme bên trong dòng. Nó sẽ giống như kịch bản bạn sẽ chạy.

Sau khi tạo tệp và dán dòng trên, hãy chạy đoạn sau trong cùng thư mục với tập lệnh:

chmod +x cutme. Điều này sẽ cung cấp cho tệp mới của bạn cờ "Thực thi" để bạn có thể thực thi nó như thế này : ./cutme.


Tại sao tôi nên cố gắng di chuyển các tệp đã có trong thư mục cha?
Rahul Virpara

Bạn sẽ chạy tập lệnh từ bên trong thư mục. Mỗi tệp trong đó, nếu bên trong thư mục con hay không sẽ chuyển sang thư mục mẹ của thư mục. Thư mục mẹ ở đây là cha mẹ liên quan đến vị trí của tập lệnh. Thực tế bằng cách thay đổi 2 dấu chấm cuối cùng, bạn có thể biết nơi di chuyển tất cả các tệp trong một thư mục nơi bạn chạy tập lệnh.
Luis Alvarado
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.