web-dev-qa-db-fra.com

Comment déplacer tous les fichiers, y compris les fichiers cachés, dans le répertoire parent via *

Sa doit être une question populaire mais je n'ai pas pu trouver de réponse.

Comment déplacer tous les fichiers via *, y compris les fichiers cachés, dans un répertoire parent comme ceci:

mv /path/subfolder/* /path/

Cela déplacera tous les fichiers dans le répertoire parent comme prévu, mais ne déplacera pas les fichiers cachés. Comment faire ça?

100
TroodoN-Mike

Vous trouverez un ensemble complet de solutions à ce sujet dans la réponse de UNIX & Linux à Comment déplacer tous les fichiers (y compris les fichiers cachés) d’un répertoire à un autre? . Il montre des solutions en bash, zsh, ksh93, sh standard (POSIX), etc.


Vous pouvez utiliser ces deux commandes ensemble:

mv /path/subfolder/* /path/   # your current approach
mv /path/subfolder/.* /path/  # this one for hidden files

Ou tous ensemble ( merci pfnuesel ):

mv /path/subfolder/{.,}* /path/

Qui s'étend à:

mv /path/subfolder/* /path/subfolder/.* /path/

(exemple: echo a{.,}b se développe en a.b ab)

Notez que ceci affichera quelques avertissements:

mv: cannot move ‘/path/subfolder/.’ to /path/.’: Device or resource busy
mv: cannot remove /path/subfolder/..’: Is a directory

Ignorez-les simplement: cela se produit parce que /path/subfolder/{.,}* s'étend également à /path/subfolder/. et /path/subfolder/.., qui constituent le répertoire et le répertoire parent (Voir Que font “.” Et “.. ”Signifie quand dans un dossier? ).


Si vous voulez simplement copier, vous pouvez utiliser un simple:

cp -r /path/subfolder/. /path/
#                     ^
#                     note the dot!

Cela copiera tous les fichiers, qu'ils soient normaux ou cachés, puisque /path/subfolder/. s'étend à "tout de ce répertoire" (Source: Comment copier avec cp pour inclure les fichiers cachés et les répertoires cachés et leur contenu? )

184
fedorqui

Cela déplacera tous les fichiers dans le répertoire parent comme prévu, mais ne déplacera pas les fichiers cachés. Comment faire ça?

Vous pouvez activer dotglob:

shopt -s dotglob               # This would cause mv below to match hidden files
mv /path/subfolder/* /path/

Pour désactiver dotglob, vous devez indiquer:

shopt -u dotglob
28
devnull

Je pense que c'est le plus élégant, car il n'essaie pas non plus de bouger ..:

mv /source/path/{.[!.],}* /destination/path
26
Vanderstaaij

Une solution plus simple consiste à utiliser l'utilitaire rsync:

rsync -vuar --delete-after path/subfolder/ path/

L’avantage est que le dossier original (subfolder) serait supprimé ainsi qu’une partie de la commande. Lorsque vous utilisez les exemples mv, vous devez toujours nettoyer vos dossiers, sans parler de problèmes supplémentaires. couvrez les fichiers cachés et non cachés en un seul motif.

De plus, rsync prend en charge la copie/le déplacement de fichiers entre les télécommandes et garantit que les fichiers sont copiés exactement comme ils étaient à l’origine (-a).

Le paramètre utilisé -u ignorerait les nouveaux fichiers existants, -r recurse dans des répertoires et -v augmenterait la verbosité.

4
kenorb

En utilisant la commande find conjointement avec la commande mv, vous pouvez empêcher la commande mv d’essayer de déplacer des répertoires (par exemple, .. et .) et sous-répertoires. Voici une option:

find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \;

Certaines des autres réponses fournies posent des problèmes. Par exemple, chacun des éléments suivants essaiera de déplacer les sous-répertoires du chemin source:

1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/
2) mv /path/subfolder/{.,}* /path/ 
3) mv /source/path/{.[!.],}* /destination/path

En outre, 2) comprend le. et .. fichiers et 3) manque des fichiers tels que ..foobar, ... barfoo, etc.

Vous pouvez utiliser mv /source/path/{.[!.],..?,}* /destination/path, qui inclurait les fichiers manquants par 3), mais il essaierait toujours de déplacer des sous-répertoires. L'utilisation de la commande find avec la commande mv décrite ci-dessus élimine tous ces problèmes.

3
teancum144

Laissez-moi vous présenter mon ami "dotglob". Il s'allume et s'éteint si "*" inclut ou non les fichiers cachés.

$ mkdir test
$ cd test
$ touch a b c .hidden .hi .den
$ ls -a
. ..  .den  .hi .hidden a b c

$ shopt -u dotglob
$ ls *
a b c
$ for i in * ; do echo I found: $i ; done
I found: a
I found: b
I found: c

$ shopt -s dotglob
$ ls *
.den  .hi .hidden a b c
$ for i in * ; do echo I found: $i ; done
I found: .den
I found: .hi
I found: .hidden
I found: a
I found: b
I found: c

La valeur par défaut est "off".

$ shopt dotglob
dotglob         off

Il est préférable de le réactiver lorsque vous avez terminé, sinon vous allez confondre les choses qui supposent qu'il sera éteint.

2
TomOnTime

Ma solution à ce problème lorsque je dois copier tous les fichiers (y compris les fichiers .) dans un répertoire cible conserver les autorisations est: (écraser si elle existe déjà) )

yes | cp -rvp /source/directory /destination/directory/

yes sert à écraser automatiquement les fichiers de destination, r récursif, v verbose, p conserve les autorisations.

Notez que le le chemin source ne se termine pas par un / (donc tous les fichiers/répertoire et fichiers. Sont copiés)

Le répertoire de destination se termine par / car nous plaçons le contenu du dossier source dans le répertoire de destination.

1
Rajneesh Gadge