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


Ce doit être une question populaire mais je n'ai pas trouvé de réponse.

Comment déplacer tous les fichiers via * y compris les fichiers cachés aussi bien dans le 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?


67
2017-11-25 11:34


origine


Réponses:


Vous pouvez trouver un ensemble complet de solutions à ce sujet dans la réponse de UNIX & Linux à Comment déplacez-vous tous les fichiers (y compris les fichiers cachés) d'un répertoire à un autre?. Il montre des solutions dans Bash, zsh, ksh93, standard (POSIX) sh, 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 à a.b ab)

Notez que cela affichera quelques avertissements:

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

Il suffit de les ignorer: cela se produit parce que /path/subfolder/{.,}* étend également à /path/subfolder/. et /path/subfolder/.., qui sont le répertoire et le répertoire parent (Voir Qu'est-ce que "." Et ".." signifient 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, à la fois normaux et cachés, depuis /path/subfolder/. se développe à "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?)


135
2017-11-25 11:35



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

Vous pourriez allumer dotglob:

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

Pour éteindre dotglob, vous devriez dire:

shopt -u dotglob

24
2017-11-25 11:37



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

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

23
2018-01-15 12:05



Solution alternative plus simple consiste à utiliser rsync utilitaire:

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

L'avantage est que le dossier d'origine (subfolder) serait supprimé aussi bien qu'une partie de la commande, et lors de l'utilisation mv exemples ici vous avez encore besoin de nettoyer vos dossiers, sans parler des maux de tête supplémentaires pour couvrir les fichiers cachés et non cachés dans un seul motif.

en outre rsync prend en charge la copie / le déplacement de fichiers entre des télécommandes et veille à ce que les fichiers soient copiés exactement tels qu'ils étaient (-a).

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


3
2018-05-27 23:07



Laissez-moi vous présenter mon ami "dotglob". Il allume et éteint, que "*" inclue ou non des 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 risquez de confondre les choses qui supposent que ce sera désactivé.


1
2017-11-25 11:46



En utilisant le find commande en conjonction avec le mv commande, vous pouvez empêcher le mv commande d'essayer de déplacer des répertoires (par ex. .. et .) et sous-répertoires. Voici une option:

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

Il y a des problèmes avec certaines des autres réponses fournies. 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

Aussi, 2) comprend le. et .. fichiers et 3) fichiers manquants comme ..foobar, ... barfoo, etc.

Vous pourriez utiliser, mv /source/path/{.[!.],..?,}* /destination/path, qui inclurait les fichiers manqués par 3), mais il essaierait quand même de déplacer les sous-répertoires. En utilisant le find commande avec le mv commande que je décris ci-dessus élimine tous ces problèmes.


1
2017-07-15 18:31



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

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

yes est pour écraser automatiquement les fichiers de destination, r récursif, v verbeux, p conserver les autorisations.

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

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


1
2018-01-30 20:46