Question Comment puis-je obtenir mv (ou le joker *) pour déplacer les fichiers cachés?


Je migre mon répertoire personnel d'un ancien système vers un nouveau, et l'archive que j'ai créée contient tout, y compris des fichiers cachés tels que .bashrc. Toutefois, lorsque je déplace le contenu de l’archive tar (qui sont dans / tmp) dans mon nouveau répertoire de base, les fichiers masqués ne sont pas copiés (mv /tmp/home/rcook/* /home/rcook/). Comment puis-je obtenir que mv les déplace?

En fait, je pense que le problème n'est pas avec mv, mais avec la globalisation de bash. Si je fais ceci:

mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/

Je vois ça:

a/:
.  ..  .foo

b/:
.  ..  bar

a/.foo n'a pas bougé. Alors, comment puis-je obtenir le caractère générique * pour trouver des fichiers cachés?

Oui, je suppose que je pourrais décompresser l'archive directement dans mon répertoire personnel, mais l'archive se décompose en home/rcook/..., et je veux être sûr de remplacer le nouveau .bashrc, etc. avec les anciennes versions personnalisées, et savoir trouver et déplacer des fichiers cachés est une compétence intéressante. Suggestions?


Certaines réponses suggèrent de faire quelque chose comme mv src/.* dest/. Cependant, j'ai essayé ceci sur mes répertoires de test et j'ai eu des erreurs. Commençant par:

rcook$ ls -a a/ b/
a/:
.  ..  bar  .foo

b/:
.  ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
.  ..  bar

b/:
.  ..  .foo

Qu'est-ce que je fais mal?


100
2018-02-21 19:14


origine


unix.stackexchange.com/a/251091/139312 - palindrom


Réponses:


Tu peux le faire :

shopt -s dotglob
mv /tmp/home/rcook/* /home/rcook/

Tu peux mettre

shopt -s dotglob

dans ton ~/.bashrc si vous voulez que ce soit la valeur par défaut.

Voir http://mywiki.wooledge.org/glob


Une autre approche pour copier les fichiers de points:

mv /tmp/home/rcook/.[!.]* /home/rcook/

Ne pas utiliser le motif ..* comme il correspond .. (pointeur vers le répertoire parent). S'il y a des fichiers dont le nom commence par deux points (..something), utilisez également le motif ..?*.


114
2018-02-21 19:16



S'il vous plaît vérifier les ajouts que j'ai mis au bas de ma question. Merci. - Randall Cook
Rien de mal, . et .. sont des répertoires spéciaux: respectivement dir actuel Et répertoire parent. C'est juste un avertissement. Meilleure utilisation shopt -s dotglob Solution - Gilles Quenot
J'ai fini par faire deux mouvements: mv home/rcook/* /home/rcook/ suivi par mv home/rcook/.* /home/rcook/. Cela a fait l'affaire, même si je souhaitais avoir suivi le lien et lire d'abord sur le mode dotglob. Cela m'aurait fait économiser un pas. +1 - Randall Cook
Donc, la seconde approche nécessite l'utilisation de chemins absolus? - franzlorenzon
Si vous utilisez zsh, vous pouvez utiliser la D qualificatif globulant ou la GLOB_DOTS option shell. - mgalgs


Dans vos ajouts, vous avez des erreurs, mais le code fonctionne toujours. La seule chose à ajouter est que vous l'avez dit seulement copier les fichiers de points. Essayer:

mv src/* src/.* dst/

Vous aurez toujours les erreurs pour le. et .. entrées, ce qui est bien. Mais le déménagement devrait réussir.

~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move ‘from/.’ to ‘to/.’: Device or resource busy
mv: cannot remove ‘from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
.  ..

to/:
.  ..  test  .test

23
2018-01-03 18:47



Bons points, @AndrewSchwartz. J'aime cette approche aussi. Je pense que cela mérite plus de reconnaissance. - Randall Cook


Si vous ls -l dans un répertoire, vous verrez . et .. parmi les fichiers listés. Donc je pense mv .* /dest prend ces pointeurs en compte. Essayer:

mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/

cela ignorera les pointeurs de répertoire actuels et parents.

Vous obtiendrez une erreur si l'un des trois modèles *, [^.]* ou ..?* ne correspond à aucun fichier, vous ne devez donc inclure que ceux qui correspondent.


10
2018-06-14 12:20



Agréable. Une réponse similaire pour ce style de globulation est ici: superuser.com/a/784046/144977 . Merci d'avoir posté ceci. - phyatt


Deux solutions possibles, je peux penser. La première consiste à utiliser cp à la place avec son option récursive, en copiant le répertoire actuel vers la destination.

cp -Rp . /desired/directory

alors vous pouvez supprimer les fichiers source dans le répertoire en cours

Alternativement, si vous savez que les fichiers sont bien nommés (pas d'espaces, de caractères génériques, de caractères non imprimables), vous pouvez faire quelque chose comme ça

mv $(ls -A) /desired/directory

5
2018-02-21 22:03



Copy-then-remove est très différent de move si la source et la cible sont sur le même système de fichiers. Au moins inclure l'option -p pour préserver les métadonnées. En utilisant ls devrait être un dernier recours, et il existe ici des moyens plus simples et plus simples. - Gilles


Il n'y a pas vraiment de fichiers "cachés" sur Linux. Les fichiers qui commencent par un point sont simplement masqués par défaut dans les listes de fichiers.

Pour copier des fichiers même avec un glob, vous devez préfixer le fichier avec . tel que mv -u .* foo et alors .foo apparaîtra comme foo/.foo lorsqu'il est déplacé

L'option -u ne déplacera les fichiers que lorsque la source est plus récente ou que la destination est manquante. Ou vous pourriez simplement ignorer les erreurs sur le déplacement . et .. comme ils sont des fichiers spéciaux et ne peuvent pas être déplacés, mais se faire prendre dans le .*glob par la coquille.


2
2018-02-21 19:17



S'il vous plaît vérifier les ajouts que j'ai mis au bas de ma question. Merci. - Randall Cook


Donc nous avons:

a
|-- .foo
`-- bar

et:

b

J'ai pris un énorme trouver du temps une meilleure solution que toutes les réponses ici.

Puis j'ai pris 30 secondes pour cette commande:

$ mv --help

Puis j'ai trouvé mon amour:

$ mv a/ b/ -T

Note: je ne comprends même pas l'argument -T. Ça a juste fait ce dont j'avais besoin. Ici il est dit:

-T, --no-target-directory  Traiter DEST comme un fichier normal


0
2017-07-28 00:42



Si vous omettez les barres obliques, vous ne devriez pas avoir besoin -T. Dans tous les cas, cela consiste essentiellement à dire à mv de déplacer le répertoire lui-même, plutôt que de déplacer tous les fichiers à l'intérieur de celui-ci. - thomasrutter
@ thomasrutter, déplacer le répertoire n'est-il pas la même chose que le renommer? - Randall Cook
Oui, si la destination parente reste la même, il suffit essentiellement de la renommer. Quoi qu’il en soit, il n’est probablement pas utile de répondre à la question initiale, qui concernait le déplacement des fichiers. à l'intérieur le répertoire dans un endroit donné. - thomasrutter


Si vous souhaitez copier des fichiers, y compris des fichiers cachés, dans le répertoire en cours dans lequel vous vous trouvez.

cp -Rp source-directory/. .

-1
2017-09-05 00:51



Ceci est très similaire à la réponse de Drake Clarris de 2013. Avez-vous autre chose à ajouter? - Randall Cook