Thay vì sử dụng find
(công việc này hoạt động tốt), bạn cũng có thể sử dụng shell cho mục đích này.
Giả sử bạn muốn tất cả các tệp từ $ PWD đến $ DEST. Nỗ lực tự nhiên sẽ là:
mv $PWD/* $DEST
Cái này hoạt động ra sao? Biểu thức "$ PWD / *" mở rộng thành tên của tất cả các tệp trong thư mục đó. Tính năng vỏ này được gọi là "continbing". Đối số cuối cùng mv
là thư mục đích. Nếu bạn có rất nhiều tệp, điều này sẽ không hoạt động vì độ dài của dòng lệnh bị giới hạn.
Nhưng giải pháp có vấn đề là nó bỏ qua các tệp chấm - hoặc các tệp, tệp và thư mục "ẩn" có tên bắt đầu bằng dấu ".". Để giải quyết điều này, bạn phải nói với trình bao của bạn bao gồm các dotfiles khi tạo khối. Để làm điều này, sử dụng
shopt -s dotglob
khi sử dụng bash
(và bạn có thể sử dụng bash
trừ khi bạn thay đổi mặc định). Trong shell này, lệnh trên cũng sẽ hoạt động cho dotfiles.
Như một bên, trong zsh
, bạn có tùy chọn để chọn điều này trên cơ sở từng trường hợp. Để làm điều này, đặt
setopt extendedglob
trong của bạn .zshrc
. Sau đó, bạn có thể sử dụng
mv $PWD/*(D) $DEST
để di chuyển tất cả các tệp, bao gồm cả dotfiles. ("D" có tác dụng tạm thời bật tùy chọn "GLOB_DOTS").
Bây giờ câu hỏi ban đầu là để di chuyển tất cả các tệp thông thường (không phải thư mục) từ tất cả các thư mục con và thư mục con của chúng sang một thư mục. Điều này có thể được thực hiện với zsh
:
mv $PWD/**/*(D.)
Ở đây biểu thức **/*
làm cho quả cầu xuống theo cách đệ quy thành các thư mục con. Có D
nghĩa là "cũng chọn dotfiles '; .
phương tiện" chỉ chọn các tệp thông thường, không phải các thư mục ".