Regex không liên quan ở đây. Ký tự đại diện trong bash (giống như hầu hết các shell khác) chỉ khớp với các tệp dựa trên tên tệp, không dựa trên loại tệp hoặc các đặc điểm khác. Có một cách để khớp theo loại: thêm /
vào cuối mẫu làm cho nó chỉ khớp các thư mục hoặc liên kết tượng trưng đến thư mục. Bằng cách này, bạn có thể di chuyển các thư mục, sau đó di chuyển những gì còn lại và di chuyển các thư mục trở lại - cồng kềnh nhưng nó hoạt động.
tmp=$(TMPDIR=.. mktemp -d)
mv -- */ "$tmp"
mv -- * "$tmp"/other_directory/
mv "$tmp"/* .
rmdir "$tmp"
Một cách tiêu chuẩn để khớp các tệp theo loại là gọi find
.
find . -name . -o -type d -prune -o -exec sh -c 'mv "$@" "$0"' other_directory/ {} +
Trong zsh, bạn có thể sử dụng vòng loại toàn cầu để khớp các tệp theo loại. Vòng .
loại phù hợp với các tập tin thông thường; sử dụng ^/
để khớp với tất cả các thư mục không hoặc -^/
cũng bao gồm các liên kết tượng trưng đến các thư mục.
mv -- *(.) other_directory/
Trong bất kỳ shell, bạn có thể chỉ cần lặp.
for x in *; do
if ! [ -d "$x" ]; then
mv -- "$x" other_directory/
fi
done