Tôi có một thư mục A
trong đó có các file và thư mục, tôi muốn di chuyển tất cả các tập tin và thư mục vào thư mục khác B
, trừ file
, file2
, directory
, và directory2
.
Điều này có thể giải quyết như thế nào?
Tôi có một thư mục A
trong đó có các file và thư mục, tôi muốn di chuyển tất cả các tập tin và thư mục vào thư mục khác B
, trừ file
, file2
, directory
, và directory2
.
Điều này có thể giải quyết như thế nào?
Câu trả lời:
Với zsh
:
setopt extendedglob # best in ~/.zshrc
mv A/^(file|directory)(|2)(D) B/
(các tệp (D)
bao gồm dấu chấm (ẩn)).
Với bash
:
shopt -s extglob dotglob failglob
mv A/!(@(file|directory)?(2)) B/
Với ksh93
(FIGNORE='@(.|..|@(file|directory)?(2))'; mv A/* B)
những gì tôi thường làm
cd A
ls > a
(giả sử bạn không có tệp 'a').
vi a
loại bỏ bất cứ tập tin hoặc thư mục nào được giữ đúng vị trí
mv $(<a) B
-
. Bạn sẽ không thể phát hiện ra tên tệp có chứa các ký tự dòng mới và nó sẽ bỏ qua các tệp ẩn.
ls
là bí danh ls -F
(thường gặp khi không sử dụng màu sắc), các đường dẫn nguồn có thể dẫn đầu /
, có thể có tác dụng phụ nghiêm trọng - xem "Cảnh báo" và "Chém chém" trong info mv
(hoặc pinfo mv
, nhưng không phải trong man mv
)
Bạn có thể sử dụng find
với các biểu thức loại trừ:
find . ! -name . -prune ! -path ./file \
! -path ./file2 \
! -path ./directory \
! -path ./directory2 \
-exec mv {} your_destination \;
Giải pháp này được lấy cảm hứng từ câu hỏi này .
-E
tùy chọn. Nhưng có thể có sự khác biệt giữa các hệ thống của chúng tôi, vì tôi hiện đang dùng OSX.
Nếu ./A
và ./B
nằm trên cùng một hệ thống tệp và nếu các tệp này chưa tồn tại trong ./B
:
file file2 directory directory2
... thì hoạt động này chỉ là nguyên tử:
cd ./A; mv * ../B
for mv in file file2 directory directory2
do mv ../B/"$mv" .
done
Nếu không, thì có ít nhất 8 bản sao thiết bị chéo bổ sung được thực hiện với bộ lệnh trên.
mv
unlinks
và renames
khi không vượt qua các nhà phát triển - về cơ bản, nó chỉ ảnh hưởng đến răng. Nhưng cái vỏ không vào được.