Tôi có một thư mục Atrong đó 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 Atrong đó 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.
lslà 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 findvớ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 .
-Etù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 ./Avà ./Bnằ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 unlinksvà renameskhi 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.