xargs
iş için bir araçtır. Bu ya da find
ile -exec … {} +
. Bu araçlar, bir defada iletilebilecek birçok argümanla birkaç kez komut çalıştırır.
Her iki yöntemin de değişken argüman listesi sonunda olduğunda gerçekleştirmesi daha kolaydır, buradaki durum bu değil: mv
hedefin son argümanı . GNU yardımcı programları ile (yani gömülü olmayan Linux veya Cygwin'de), önce hedefi geçmek için -t
seçenek mv
faydalıdır.
Dosya adlarının boşlukları veya hiçbiri \"'
yoksa, dosya adlarını girdi olarak belirtebilirsiniz xargs
( echo
komut bir bash yerleşiktir, bu nedenle komut satırı uzunluğu sınırına tabi değildir):
echo !(*.jpg|*.png|*.bmp) | xargs mv -t targetdir
Varsayılan alıntı formatı yerine boş ayrılmış giriş kullanmak için bu -0
seçeneği xargs
kullanabilirsiniz.
printf '%s\0' !(*.jpg|*.png|*.bmp) | xargs -0 mv -t targetdir
Alternatif olarak, ile dosya adlarının listesini oluşturabilirsiniz find
. Alt dizinlere tekrarlama yapmamak için, kullanın -type d -prune
. Listelenen görüntü dosyaları için hiçbir işlem belirtilmediğinden, yalnızca diğer dosyalar taşınır.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec mv -t targetdir/ {} +
(Bu, kabuk joker yöntemlerinden farklı olarak nokta dosyalarını içerir.)
GNU yardımcı programlarına sahip değilseniz, argümanları doğru sırada almak için bir ara kabuk kullanabilirsiniz. Bu yöntem tüm POSIX sistemlerinde çalışır.
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec sh -c 'mv "$@" "$0"' targetdir/ {} +
Zsh, sen yükleyebilirsiniz mv
yerleşiğini :
setopt extended_glob
zmodload zsh/files
mv -- ^*.(jpg|png|bmp) targetdir/
veya izin vermeyi tercih ederseniz mv
ve diğer isimler harici komutlara atıfta bulunursa :
setopt extended_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- ^*.(jpg|png|bmp) targetdir/
veya ksh tarzı küre ile:
setopt ksh_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- !(*.jpg|*.png|*.bmp) targetdir/
Alternatif olarak, GNU mv
ve kullanarak zargs
:
autoload -U zargs
setopt extended_glob
zargs -- ./^*.(jpg|png|bmp) -- mv -t targetdir/