186 votes

Comment faire pour que mv (ou le caractère générique *) déplace les fichiers cachés ?

Je suis en train de migrer mon répertoire personnel d'un ancien système vers un nouveau, et l'archive tarball que j'ai créée contient tout, y compris les fichiers cachés comme .bashrc. Cependant, lorsque je déplace le contenu de l'archive déballée (qui se trouve dans /tmp) vers mon nouveau répertoire personnel, les fichiers cachés ne sont pas copiés ( mv /tmp/home/rcook/* /home/rcook/ ). Comment puis-je faire en sorte que mv les déplace ?

En fait, je pense que le problème n'est pas avec mv, mais avec le globbing 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 faire pour que le joker * trouve les 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 être sûr que j'écrase la nouvelle .bashrc etc. avec les anciennes versions personnalisées, et savoir comment trouver et déplacer les fichiers cachés est une compétence utile. Des suggestions ?


Certaines réponses suggèrent de faire quelque chose comme mv src/.* dest/ . Cependant, j'ai essayé cela sur mes répertoires de test et j'ai obtenu des erreurs. En 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 de mal ?

4voto

lak-b Points 764

Il n'existe pas vraiment de fichiers "cachés" sous Linux. Les fichiers qui commencent par un point sont simplement cachés des listes de fichiers par défaut.

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

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

0voto

user433901 Points 1

Donc nous avons :

a
|-- .foo
`-- bar

et :

b

J'ai pris un énorme temps de trouver 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 . Il a juste fait ce dont j'avais besoin. C'est écrit ici :

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

0voto

Isaiah Points 101

Dans mon cas, j'essayais simplement de mv un seul fichier caché et c'était la solution :

FILE=.myHiddenFile
mv "$FILE" dest/

Explication

Au début, j'essayais :

mv .myHiddenFile dest/

Mais il a continué à produire l'erreur :

mv: cannot stat '.myHiddenFile': No such file or directory

Même si un ls -al a montré que le dossier et dest/ existé.

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 y a probablement d'autres façons de résoudre ce problème, mais cela a été suffisant pour nous.

0voto

Jeremy Davis Points 125

Une autre méthode consiste à utiliser (GNU) find :

find /tmp/home/rcook/ -mindepth 1 -maxdepth 1 -exec mv {} /home/rcook/ \;

-1voto

Rick Points 267

Si vous voulez copier des fichiers, y compris des fichiers cachés, dans le répertoire actuel dans lequel vous vous trouvez.

cp -Rp source-directory/. .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X