xargs
adalah alat untuk pekerjaan itu. Itu, atau find
dengan -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 mv
adalah tujuannya. Dengan utilitas GNU (yaitu pada Linux yang tidak tertanam atau Cygwin), -t
opsi untuk mv
berguna, untuk melewati tujuan terlebih dahulu.
Jika nama file tidak memiliki spasi putih atau apapun \"'
, maka Anda dapat memberikan nama file sebagai input xargs
( echo
perintahnya adalah bash builtin, sehingga tidak tunduk pada batas panjang baris perintah):
echo !(*.jpg|*.png|*.bmp) | xargs mv -t targetdir
Anda dapat menggunakan -0
opsi untuk xargs
menggunakan 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 mv
builtin :
setopt extended_glob
zmodload zsh/files
mv -- ^*.(jpg|png|bmp) targetdir/
atau jika Anda lebih suka membiarkan mv
dan 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 mv
dan zargs
:
autoload -U zargs
setopt extended_glob
zargs -- ./^*.(jpg|png|bmp) -- mv -t targetdir/