fichiers mv avec | xargs

18

J'essaie simplement de déplacer un tas de fichiers (pas de liens symboliques) de mon dossier / etc / apache / sites-enabled vers le dossier / etc / apache / sites-available avec les éléments suivants:

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

mais je suis un ubuntu n00b et je reçois cette erreur:

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

où «fichier réel» est un fichier de test que j'ai configuré sur mon environnement de développement. J'essaye de ranger le bordel de quelqu'un d'autre sur un serveur de production ;-)

Rob
la source

Réponses:

27

Vous pouvez essayer l' -execoption avec la findcommande,

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

Pour déplacer des fichiers appartenant à root, vous avez besoin d' sudoautorisations.

Si vous souhaitez utiliser la xargscommande, ajoutez-y une -Ioption.

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

Idéalement, vous devez utiliser -print0 avec find, afin que les noms de fichiers avec des espaces ne gâchent pas les choses.

Par exemple, cela devrait fonctionner:

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

vous pouvez également utiliser une autre façon d'effectuer la même chose mais avec une performance supplémentaire :

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

Notez qu'il se termine avec les \+moyens pour la commande find d'obtenir la sortie et de développer {}ce que vous voulez, de cette manière vous évitez les deux options ( \;= pour chaque entrée ET rediriger vers une nouvelle commande xargs)

Voici l'explication (vous pouvez également consulter le manuel man find)

-exec command {} + Cette variante de l'action -exec exécute la commande spécifiée sur les fichiers sélectionnés, mais la ligne de commande est créée en ajoutant à la fin chaque nom de fichier sélectionné; le nombre total d'appels de la commande sera bien inférieur au nombre de fichiers correspondants. La ligne de commande est construite de la même manière que xargs construit ses lignes de commande. Une seule instance de '{}' est autorisée dans la commande. La commande est exécutée dans le répertoire de départ.

gonzalesraul
la source