web-dev-qa-db-fra.com

Comment puis-je obtenir mv (ou le caractère générique *) pour déplacer des 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. Cependant, lorsque je déplace le contenu de l'archive tar décompressée (qui se trouve dans/tmp) vers mon nouveau répertoire de base, les fichiers cachés ne sont pas copiés (mv /tmp/home/rcook/* /home/rcook/). Comment puis-je obtenir pour les déplacer?

En fait, je pense que le problème ne vient pas de mv, mais de bash. Si je fais ça:

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 est décompressée en home/rcook/... et je veux m'assurer d'écraser le nouveau .bashrc, etc. avec les anciennes versions personnalisées, et savoir comment rechercher et déplacer. fichiers cachés est une compétence utile. 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?

124
Randall Cook

Tu peux le faire :

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

Vous pouvez mettre

shopt -s dotglob

dans votre ~/.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/

N'utilisez pas le modèle ..* car il correspond à .. (pointeur sur le répertoire parent). S'il existe des fichiers dont le nom commence par deux points (..something), utilisez également le modèle ..?*.

136
Gilles Quenot

Dans vos ajouts, vous avez des erreurs mais le code fonctionnait 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 fichier. 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
40
Andrew Schwartz

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

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

cela ignorera les pointeurs de dir 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
Azamat

Deux solutions possibles auxquelles je peux penser. La première consiste à utiliser cp à la place avec son option récursive, en copiant le répertoire actuel dans 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 nommés proprement (sans espaces, caractères génériques, caractères non imprimables), vous pouvez faire quelque chose comme ceci.

mv $(ls -A) /desired/directory
7
Drake Clarris

Il n’existe pas vraiment de fichiers "cachés" sous Linux. Les fichiers commençant par un point sont simplement masqués des listes de fichiers par défaut.

Pour copier des fichiers même avec un glob, vous devez préfixer le fichier avec . tel que mv -u .* foo, puis .foo apparaîtra sous la forme foo/.foo lors du déplacement.

L'option -u ne déplacera les fichiers que lorsque la source est plus récente ou que la destination est manquante. Ou vous pouvez simplement ignorer les erreurs concernant le déplacement de . et de .. car il s’agit de fichiers spéciaux qui ne peuvent pas être déplacés, mais vous êtes pris dans le glob .* par le shell.

2
dobey

Donc nous avons:

a
|-- .foo
`-- bar

et:

b

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

Puis j'ai pris secondes pour cette commande:

$ mv --help

Puis j'ai retrouvé mon amour:

$ mv a/ b/ -T

Remarque: je ne comprends même pas l'argument -T. Il a juste fait ce dont j'avais besoin. Ici on dit:

-T, --no-target-directory considère DEST comme un fichier normal

0
user433901