file mv dengan | xargs

18

Saya hanya mencoba untuk memindahkan banyak file (bukan symlink) dari folder / etc / apache / sites-enabled saya ke folder / etc / apache / sites-available dengan yang berikut:

/etc/apache2/sites-enabled$ find . -maxdepth 1 -type f | xargs mv {} ../sites-available/

tapi saya ubuntu n00b dan saya mendapatkan kesalahan ini:

mv: target `./real-file' is not a directory

di mana 'file nyata' adalah file uji yang telah saya atur di lingkungan dev saya. Saya mencoba merapikan kekacauan orang lain di server produksi ;-)

rampok
sumber

Jawaban:

27

Anda dapat mencoba -execopsi dengan findperintah,

/etc/apache2/sites-enabled$ sudo find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \;

Untuk memindahkan file yang dimiliki oleh root, Anda memerlukan sudoizin.

Jika Anda ingin menggunakan xargsperintah maka tambahkan -Iopsi untuk itu.

find . -maxdepth 1 -type f | sudo xargs -I {} mv {} /etc/apache2/sites-available/
Avinash Raj
sumber
7

Idealnya Anda harus menggunakan -print0 dengan find, jadi nama file dengan spasi tidak mengacaukan segalanya.

Misalnya ini harus bekerja:

find . -whatever-flags-go-here -print0 | xargs -r0 mv -t target-directory
David Goodwin
sumber
0

Anda juga dapat menggunakan cara lain untuk melakukan hal yang sama tetapi dengan kinerja ekstra :

find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \+

Perhatikan bahwa itu berakhir dengan \+yang berarti untuk perintah find untuk mendapatkan output dan memperluas {}melakukan apa yang Anda inginkan, dengan cara ini Anda menghindari dua opsi ( \;= untuk setiap entri DAN memipis ke perintah baru xargs)

Inilah penjelasannya (Anda juga dapat memeriksa manualnya man find)

-exec command {} + Varian aksi -exec ini menjalankan perintah yang ditentukan pada file yang dipilih, tetapi baris perintah dibangun dengan menambahkan setiap nama file yang dipilih di akhir; jumlah total doa perintah akan jauh lebih sedikit daripada jumlah file yang cocok. Baris perintah dibangun dengan cara yang sama seperti xargs membangun baris perintahnya. Hanya satu instance dari '{}' diizinkan dalam perintah. Perintah dijalankan di direktori awal.

gonzalesraul
sumber