file mv con | xargs

9

Sto solo cercando di spostare una serie di file (non di collegamenti simbolici) dalla cartella / etc / apache / sites-enabled nella cartella / etc / apache / sites-available con il seguente:

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

ma io sono un ubuntu n00b e sto ricevendo questo errore:

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

dove 'real-file' è un file di test che ho impostato sul mio ambiente di sviluppo. Sto cercando di riordinare il casino di qualcun altro su un server di produzione; -)

    
posta Rob 23.06.2014 - 10:17

3 risposte

17

Potresti provare l'opzione -exec con il comando find ,

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

Per spostare i file di proprietà di root, hai bisogno delle autorizzazioni di sudo .

Se si desidera utilizzare il comando xargs , aggiungere ad esso l'opzione -I .

find . -maxdepth 1 -type f | sudo xargs -I {} mv {} /etc/apache2/sites-available/
    
risposta data Avinash Raj 23.06.2014 - 10:22
2

Idealmente dovresti usare -print0 con find, quindi i nomi dei file con spazi non rovinano tutto.

es. questo dovrebbe funzionare:

find . -whatever-flags-go-here -print0 | xargs -r0 mv -t target-directory
    
risposta data David Goodwin 23.06.2014 - 18:05
0

puoi anche utilizzare un altro modo per eseguire lo stesso, ma con un rendimento extra :

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

Si noti che termina con \+ che significa che il comando find deve ottenere l'output ed espandersi in {} facendo ciò che si desidera, in questo modo si evitano le due opzioni ( \; = per ogni voce AND piping in un nuovo comando xargs )

Ecco la spiegazione (puoi anche controllare il manuale man find )

  

-exec command {} +                 Questa variante dell'azione -exec esegue il comando specificato sui file selezionati, ma il comando                 la linea viene creata aggiungendo alla fine ciascun nome di file selezionato; il numero totale di invocazioni di                 il comando sarà molto inferiore al numero di file corrispondenti. La riga di comando è costruita molto                 allo stesso modo in cui xargs costruisce le sue linee di comando. solo una istanza di "{}" è consentita all'interno di                 comando. Il comando viene eseguito nella directory di partenza.

    
risposta data Raul Gonzales 05.04.2018 - 11:57

Leggi altre domande sui tag