web-dev-qa-db-fra.com

les fichiers mv avec | Xargs

J'essaie simplement de déplacer un groupe de fichiers (et non de liens symboliques) de mon dossier/etc/Apache/sites-enabled dans 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 j'obtiens cette erreur:

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

où 'real-file' est un fichier de test que j'ai configuré sur mon environnement de développement. J'essaie de nettoyer le désordre de quelqu'un d'autre sur un serveur de production ;-)

14
Rob

Vous pouvez essayer l’option -exec avec la commande find,

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

Pour déplacer des fichiers appartenant à root, vous devez disposer d'autorisations Sudo.

Si vous souhaitez utiliser la commande xargs, ajoutez-y l'option -I.

find . -maxdepth 1 -type f | Sudo xargs -I {} mv {} /etc/Apache2/sites-available/
24
Avinash Raj

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

Par exemple. cela devrait fonctionner:

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

vous pouvez également utiliser une autre méthode pour effectuer la même chose mais avec un performance supplémentaire:

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

Notez qu'il se termine par \+, ce qui signifie que la commande find récupère la sortie et la développe dans {} en faisant ce que vous voulez. Ainsi, vous évitez les deux options (\; = pour chaque entrée ET en créant une nouvelle commande xargsname__).

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 chaque nom de fichier sélectionné à la fin. Le nombre total d'invocations 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é dans la commande. La commande est exécutée dans le répertoire de départ.

0
gonzalesraul