xargsadalah alat untuk pekerjaan itu. Itu, atau finddengan -exec … {} +. Alat-alat ini menjalankan perintah beberapa kali, dengan sebanyak mungkin argumen yang dapat dilewati dalam sekali jalan.
Kedua metode lebih mudah dilakukan ketika daftar argumen variabel di akhir, yang tidak terjadi di sini: argumen terakhir mvadalah tujuannya. Dengan utilitas GNU (yaitu pada Linux yang tidak tertanam atau Cygwin), -topsi untuk mvberguna, untuk melewati tujuan terlebih dahulu.
Jika nama file tidak memiliki spasi putih atau apapun \"', maka Anda dapat memberikan nama file sebagai input xargs( echoperintahnya adalah bash builtin, sehingga tidak tunduk pada batas panjang baris perintah):
echo !(*.jpg|*.png|*.bmp) | xargs mv -t targetdir
Anda dapat menggunakan -0opsi untuk xargsmenggunakan input yang dibatasi-nol alih-alih format kuotasi default.
printf '%s\0' !(*.jpg|*.png|*.bmp) | xargs -0 mv -t targetdir
Atau, Anda dapat membuat daftar nama file dengan find. Untuk menghindari pengulangan ke subdirektori, gunakan -type d -prune. Karena tidak ada tindakan yang ditentukan untuk file gambar yang terdaftar, hanya file lain yang dipindahkan.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec mv -t targetdir/ {} +
(Ini termasuk file dot, tidak seperti metode wildcard shell.)
Jika Anda tidak memiliki utilitas GNU, Anda dapat menggunakan shell perantara untuk mendapatkan argumen dalam urutan yang benar. Metode ini berfungsi pada semua sistem POSIX.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec sh -c 'mv "$@" "$0"' targetdir/ {} +
Di zsh, Anda dapat memuat mvbuiltin :
setopt extended_glob
zmodload zsh/files
mv -- ^*.(jpg|png|bmp) targetdir/
atau jika Anda lebih suka membiarkan mvdan nama lain terus mengacu pada perintah eksternal:
setopt extended_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- ^*.(jpg|png|bmp) targetdir/
atau dengan gumpalan ksh-style:
setopt ksh_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- !(*.jpg|*.png|*.bmp) targetdir/
Atau, gunakan GNU mvdan zargs:
autoload -U zargs
setopt extended_glob
zargs -- ./^*.(jpg|png|bmp) -- mv -t targetdir/