xargs
là công cụ cho công việc. Điều đó, hoặc find
với -exec … {} +
. Các công cụ này chạy một lệnh nhiều lần, với càng nhiều đối số có thể được truyền trong một lần.
Cả hai phương thức đều dễ thực hiện hơn khi danh sách đối số biến ở cuối, không phải là trường hợp ở đây: đối số cuối cùng mv
là đích. Với các tiện ích GNU (tức là trên Linux hoặc Cygwin không được nhúng), -t
tùy chọn mv
này rất hữu ích, để vượt qua đích trước.
Nếu tên tệp không có khoảng trắng cũng như bất kỳ tên nào \"'
, thì bạn chỉ cần cung cấp tên tệp làm đầu vào xargs
( echo
lệnh là bash dựng sẵn, vì vậy nó không chịu giới hạn độ dài dòng lệnh):
echo !(*.jpg|*.png|*.bmp) | xargs mv -t targetdir
Bạn có thể sử dụng -0
tùy chọn để xargs
sử dụng đầu vào được phân tách bằng null thay vì định dạng được trích dẫn mặc định.
printf '%s\0' !(*.jpg|*.png|*.bmp) | xargs -0 mv -t targetdir
Ngoài ra, bạn có thể tạo danh sách tên tệp với find
. Để tránh đệ quy vào các thư mục con, sử dụng -type d -prune
. Vì không có hành động nào được chỉ định cho các tệp hình ảnh được liệt kê, chỉ các tệp khác được di chuyển.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec mv -t targetdir/ {} +
(Điều này bao gồm các tệp chấm, không giống như các phương thức ký tự đại diện.)
Nếu bạn không có tiện ích GNU, bạn có thể sử dụng trình bao trung gian để nhận các đối số theo đúng thứ tự. Phương pháp này hoạt động trên tất cả các hệ thống POSIX.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec sh -c 'mv "$@" "$0"' targetdir/ {} +
Trong zsh, bạn có thể tải mv
nội dung :
setopt extended_glob
zmodload zsh/files
mv -- ^*.(jpg|png|bmp) targetdir/
hoặc nếu bạn muốn cho phép mv
và các tên khác tiếp tục tham chiếu đến các lệnh bên ngoài:
setopt extended_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- ^*.(jpg|png|bmp) targetdir/
hoặc với những quả cầu kiểu ksh:
setopt ksh_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- !(*.jpg|*.png|*.bmp) targetdir/
Ngoài ra, sử dụng GNU mv
và zargs
:
autoload -U zargs
setopt extended_glob
zargs -- ./^*.(jpg|png|bmp) -- mv -t targetdir/