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

98

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 décompressée (qui se trouve 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 lié à mv, mais à 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 ceci:

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 d'écraser 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?

    
posée Randall Cook 21.02.2013 - 20:14
la source

7 réponses

111

Vous pouvez 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 lien

Une autre approche pour copier les fichiers de points:

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

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

    
réponse donnée Gilles Quenot 21.02.2013 - 20:16
la source
22

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

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
    
réponse donnée Andrew Schwartz 03.01.2014 - 19:47
la source
9

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

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.

    
réponse donnée Azamat 14.06.2014 - 14:20
la source
5

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
    
réponse donnée Drake Clarris 21.02.2013 - 23:03
la source
2

Il n’ya pas vraiment de fichiers "cachés" sous 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 , puis .foo apparaîtra sous la forme foo/.foo lors de son déplacement.

L'option -u ne déplace 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 .. car ce sont des fichiers spéciaux et ne peuvent pas être déplacés, mais se retrouvent dans le .* glob du shell.

    
réponse donnée dobey 21.02.2013 - 20:17
la source
0

Nous avons donc:

a
|-- .foo
'-- bar

et:

b

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

Ensuite, 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 traite DEST comme un fichier normal

    
réponse donnée user433901 28.07.2015 - 02:42
la source
-1

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/. .
    
réponse donnée Rick 05.09.2016 - 02:51
la source

Lire d'autres questions sur les étiquettes