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 se décompresse en home/rcook/...
, et je veux m'assurer d'écraser les nouvelles .bashrc
, etc. avec les anciennes versions personnalisées et savoir comment trouver et déplacer les 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?
la source
Réponses:
Tu peux le faire :
Tu peux mettre
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:
N'utilisez pas le modèle
..*
tel qu'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..?*
.la source
.
et..
sont des dirs spéciaux: respectivement dir actuel et dir parent . C'est juste un avertissement. Meilleureshopt -s dotglob
solution d' utilisationmv home/rcook/* /home/rcook/
suivi demv home/rcook/.* /home/rcook/
. Cela a fait l'affaire, bien que j'aurais aimé suivre le lien et en savoir plus sur le mode pointglob. Cela m'aurait sauvé une étape. +1zsh
, vous pouvez utiliser leD
qualificatif Globbing ou l'GLOB_DOTS
option shell .Dans vos ajouts, vous avez des erreurs mais le code fonctionnait toujours. La seule chose à ajouter est que vous ne lui avez demandé que de copier les fichiers de points. Essayer:
Vous aurez toujours les erreurs pour le fichier. et .. entrées, ce qui est bien. Mais le déménagement devrait réussir.
la source
.hidden
fichier que j'avais explicitement pour résoudre mon problème.|| :
(cela||
signifie que vous exécutez ce qui suit sur false / error,:
c’est la commande noop). Mais cela supprimerait également les erreurs légitimes, par exemple le dossier de destination n’existe pas. Je ne trouve pas de méthode plus élégantemv
pour exclure les entrées.
et..
. Mais le gros avantage pour moi sur cp n’est pas d’écrire de nouveaux fichiers sur le disque.Si vous êtes
ls -l
dans un répertoire, vous verrez.
et..
parmi les fichiers listés. Donc, je pensemv .* /dest
prend ces pointeurs en compte. Essayer: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.la source
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.
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.
la source
-p
de préservation des métadonnées. L'utilisationls
devrait être un dernier recours, et il existe ici des moyens plus simples et plus efficaces.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
.
, par exemple,mv -u .* foo
et il.foo
apparaîtra alors commefoo/.foo
s'il était 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 pouvez simplement ignorer les erreurs concernant le déplacement
.
,..
car ce sont des fichiers spéciaux et ne peuvent pas être déplacés, mais ils sont pris dans le.*
glob par le shell.la source
Nous avons donc:
et:
J'ai mis beaucoup de temps à trouver une meilleure solution que toutes les réponses fournies ici.
Ensuite, j'ai pris 30 secondes pour cette commande:
Puis j'ai retrouvé mon amour:
Note: Je ne comprends même pas l'argument
-T
. Il a juste fait ce dont j'avais besoin. Ici on dit:la source
-T
. Quoi qu'il en soit, cela signifie essentiellement que mv doit déplacer le répertoire lui-même, plutôt que de déplacer tous les fichiers qu'il contient.Dans mon cas, je cherchais simplement
mv
un seul fichier caché et voici la solution:Explication
Au début j'essayais:
Mais cela continuait à produire l'erreur:
Même si un a
ls -al
montré que le fichier etdest/
existait.La raison semble être que le shell interprétait le "." dans le nom du fichier, donc en le déplaçant vers une variable, il évite l'interprétation. Il existe probablement d'autres moyens de résoudre ce problème, mais cela nous suffisait.
la source
Si vous souhaitez copier des fichiers, y compris des fichiers cachés, dans le répertoire actuel dans lequel vous vous trouvez.
la source