Làm thế nào để di chuyển tất cả các tập tin trong thư mục hiện tại sang thư mục con?


70

Tôi đang ở đường dẫn:

/myuser/downloads/

Và tôi tạo một thư mục con:

/myuser/downloads/new

Bây giờ tôi muốn di chuyển tất cả các tệp và thư mục / thư mục con trong thư mục tải xuống vào thư mục con.

tôi có thể làm cái này như thế nào?

Tôi đã thử:

mv -R *.* new/

Nhưng di chuyển không có công tắc -R có vẻ như.


4
Bạn không cần -R. Chỉ cần mv * newMặc dù, nó sẽ rên rỉ "không thể di chuyển mới để mới" hoặc một cái gì đó tương tự. Có lẽ mv -i * newđể bạn ngăn chặn ghi đè.

Câu trả lời:


101

Lệnh

mv !(new) new

nên làm thủ thuật. Nếu nó không hoạt động, chạy shopt -s extglobtrước.

Để di chuyển các tập tin / thư mục ẩn (bắt đầu bằng dấu chấm), shopt -s dotglobtrước tiên hãy chạy .
Vì vậy, để tổng hợp:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

(luôn luôn tốt hơn để bỏ đặt dotglobđể tránh những bất ngờ xấu).


5
bạn có thể đề cập đến tầm quan trọng của !(something)?
Adeerlike

2
@adeer mà chỉ nói không (gì đó). Nói cách khác, sao chép mọi thứ nhưng không phải cái gì đó. Rõ như bùn?
RockyMenezHigh

4
rất. Bạn có biết tương đương với zsh không?
Adeerlike 7/03/2016

1
Tôi không hiểu, ví dụ: Nếu tôi cố di chuyển nội dung của thư mục devđến vị trí hiện tại của mình, tôi có phải thực hiện không mv !(dev) dev?? Tôi nhận được-bash: !: event not found
Đen

5
@adeer rất giống. setopt extendedglobđể đặt chế độ toàn cầu mở rộng trong zsh. ^là biểu tượng loại trừ, do đó mv ^new newsẽ thực hiện các mẹo. sau đó để xem tất cả các tùy chọn được đặt trong zsh bạn có thể sử dụng setoptvà để tắt chế độ toàn cầu mở rộng bạn có thể làmunsetopt extendedglob
Ông T

10

Tôi đã tìm thấy một cái gì đó như thế này nhưng đơn giản hơn một chút để hiểu và nó cũng có thể hoạt động tốt cho bạn:

ls | grep -v new | xargs mv -t new

Thêm một lời giải thích cho giải pháp trên:

Từ trang người đàn ông:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

Giải thích theo bước:

  • ls sẽ liệt kê các tập tin trong thư mục hiện tại
  • grep -v new sẽ trở lại đường ống đến đó là không phù hợp mới
  • xargs mv -t newsẽ di chuyển các tập tin được dẫn đến nó từ grep -vthư mục đích

Tôi đã thử phương pháp này nhưng tôi nhận được : mv: illegal option -- t. Đây có phải là vì tôi đang sử dụng zsh?
ConstantFun

@ConstantFun Nó có thể là zsh nhưng tôi đoán đó là cách bạn thực hiện mv, (có nghĩa là phiên bản mv của bạn khác với những gì tôi đang sử dụng) bạn đang sử dụng hệ điều hành nào? Tôi tin rằng khi tôi viết câu trả lời này, tôi đã centossử dụng bản phân phối linux bash.
lockwobr

2
Chỉ cần thử nghiệm điều này trên osx và tôi nhận được cùng một lỗi mv: illegal option -- tđó là vì mv của osx không có -ttùy chọn.
lockwobr

1
(Tôi đã không cố gắng này, và không có ý định vào nó.) Liên kết này apple.stackexchange.com/questions/69223/... cho bạn biết làm thế nào để cài đặt gnucore đó sẽ giúp bạn có được gnu cli lõi utils, tàu OSX với bsd công cụ cli khác với những công cụ đi kèm với linux.
lockwobr

Tôi đang chạy OSX zsh, vậy có lẽ là HĐH rồi ..? Cảm ơn đã làm rõ!
ConstantFun

7

Ý tưởng đơn giản. Giả sử bạn đang ở / myuser , đổi tên tải xuống thành mới , tạo thư mục tải xuống mới sau đó chuyển mới vào đó.

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

Nếu bạn muốn di chuyển tất cả các tệp từ một thư mục sang một trong các thư mục con của nó, bạn có thể sử dụng lệnh sau:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

Nó sẽ tìm thấy tất cả các tệp và sau đó di chuyển chúng đến thư mục con của bạn.

@waltinator: được thêm vào -type d -name 'new' -pruneđể ngăn chặn truyền tải /myuser/downloads/new.


Tôi đã tạo một thư mục con có tên newvà thử lệnh này, tôi nhận được mv: missing file operandTry 'mv --help' for more information
mook765

1

Bạn có thể thử quá trình thay thế này.

/myuser/downloads/

nhưng, thay vì đầu tiên tạo ra các /myuser/downloads/new/thư mục, thay vì tạo ra một thư mục trong /myuser/thư mục, với lệnh mkdir ../new, sau đó di chuyển tất cả các tập tin trong downloadsđể new, và cuối cùng di chuyển newvào downloads. Bạn có thể làm điều này trong một dòng, trong khi trong /myuser/downloads/đường dẫn, với lệnh:

mkdir ../new && mv * ../new && mv ../new ../downloads

Trong trường hợp này, bạn không phải lo lắng về bất kỳ loại "lọc" các tập tin / thư mục, vì newlà trên cùng cấp của con đường như downloads, vì vậy bạn chỉ có thể di chuyển mọi thứ trong downloadsđể new, và sau đó di chuyển newvào downloads`.

Tuy nhiên, nếu bạn đã newtạo thư mục con được tạo và không muốn tạo một thư mục con khác, đừng lo lắng, điều đó chỉ cần thay đổi mkdirlệnh ở phía bên trái của lệnh đầu tiên &&được hiển thị ở trên thành mvlệnh, đẩy newlên trong con đường; nói cách khác, trong khi bạn vẫn ở /myuser/downloads/, bạn có thể đổi mkdir ../newthành mv new ... Sau đó, thư mục con new[trong đường dẫn /myuser/downloads/new/] được đẩy lên /myuser/new/, ở cùng mức với /myuser/downloads/, và sau đó bạn có thể chạy phần còn lại của lệnh như được hiển thị ở trên. Tất cả cùng nhau, chúng ta có, bắt đầu từ con đường /myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

và, vì bạn muốn "di chuyển tất cả các tệp và thư mục / thư mục con trong thư mục tải xuống vào thư mục con [ new]", bạn đã hoàn tất! Nếu bạn đã muốn di chuyển chỉ file (hoặc chỉ thư mục hoặc [chèn phong trào đối tượng chi tiết hơn]), sau đó bạn sẽ phải sử dụng các lệnh khác mà có thể "lọc" các đối tượng, chẳng hạn như grep. Các lệnh được viết ở trên là đủ cho mục đích của bạn, mặc dù.

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.