xargs dalam skrip shell

2

Saya ingin mengelompokkan gambar jpeg dengan nomor ganjil dan nomor genap. Jadi saya memang suka mengikuti:

$ mkdir odd
$ mkdir even
$ find . -regextype posix-egrep -regex ".*[13579].jpg$" -print0 | xargs -i -0 mv {} odd/
$ find . -regextype posix-egrep -regex ".*[02468].jpg$" -print0 | xargs -i -0 mv {} even/

Ini bekerja dengan baik. Dan saya menulis hal yang sama dalam skrip shell.

#!/bin/bash
mkdir odd
mkdir even
find . -regextype posix-egrep -regex ".*[13579].jpg$" -print0 | xargs -i -0 mv {} odd/
find . -regextype posix-egrep -regex ".*[02468].jpg$" -print0 | xargs -i -0 mv {} even/

Tapi itu mengembalikan kesalahan berikut:

xargs: Warning: a NUL character occurred in the input.  It cannot be passed through in the argument list.  Did you mean to use the --null option?

Mengapa skrip ini tidak berfungsi? Dan bagaimana cara memperbaikinya?

ironsand
sumber
1
Tidak yakin apa yang sedang dilakukan skrip Anda, tetapi Anda dapat menyederhanakan perintah dan melepaskan xargs sepenuhnya dengan melakukan eksekusi di find dengan opsi -exec - so 'find. -regextype posix-egrep -regex ". * [13579] .jpg $" -exec mv {} odd / \; ' akan melakukan Anda untuk baris pertama.
davidgo
Saya bertanya-tanya apakah "-i" adalah penyebab masalah Anda - menurut xargs yang digunakan untuk fungsi ganti, dan mungkin mencoba untuk mengganti karakter nol. Ini tidak menjelaskan mengapa Anda memilikinya di sana, atau mengapa itu bekerja pada baris perintah tetapi bukan skrip. Saya ingin tahu untuk mengetahui apakah menghapus -i bekerja untuk Anda.
davidgo
Terima kasih davidgo! Ini bekerja dengan opsi -exec. Tetapi saya tidak bekerja jika saya menghapus opsi -i di xargs. Saya menambahkan -i pilihan karena saya ingin menggunakan {} ekspresi dalam argumen xargs. Apakah itu tidak perlu?
ironsand

Jawaban:

0

Salah satu sumber yang mungkin untuk hal ini adalah Anda mungkin memiliki dua versi berbeda xargs dengan sintaks opsi yang berbeda, dan karena perbedaan $ PATH, skrip menggunakan yang berbeda dari sesi interaktif Anda. Anda dapat memeriksa ini dengan cukup mudah dengan menulis skrip lain untuk melihat versi apa yang ditemukannya:

#!/bin/bash
echo "xargs is: $(which xargs)"
echo "PATH is: $PATH"

... lihat apa yang dicetak skrip, lalu jalankan perintah yang sama (atau hanya which xargs ) secara interaktif dan lihat apakah Anda mendapatkan hasil yang berbeda. Jika mereka keluar berbeda, mungkin ada sesuatu di skrip inisialisasi shell Anda (~ / .bashrc, ~ / .bash_profile, dll) yang menyebabkannya.

Gordon Davisson
sumber