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?
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 ..?*
.
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
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.
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
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.
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