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 ainsi que vers le répertoire parent comme ceci:

mv /path/subfolder/* /path/

cela déplacera tous les fichiers vers le répertoire parent comme prévu mais ne déplacera pas les fichiers cachés. Comment faire?

74
demandé sur TroodoN-Mike 2013-11-25 15:34:55

7 réponses

vous pouvez trouver un ensemble complet de solutions à ce sujet dans la réponse D'UNIX & Linux à comment déplacer tous les fichiers (y compris cachés) d'un répertoire à un autre? . Il montre des solutions en 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 se développe en:

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

(exemple: echo a{.,}b devient a.b ab )

Remarque, cela montrera un couple de mises en garde:

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 aussi à /path/subfolder/. et /path/subfolder/.. , qui sont le répertoire et le répertoire parent (voir Que faire"." et." ."dire quand dans un dossier? ).


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

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

cela va copier tous les fichiers, à la fois normaux et cachés, depuis /path/subfolder/. se développe à "tout à partir de ce répertoire" (Source: comment copier avec cp pour inclure les fichiers cachés et les répertoires cachés et leur contenu? )

142
répondu fedorqui 2017-05-23 12:18:26

cela déplacera tous les fichiers dans le répertoire parent comme prévu mais déplacez pas les fichiers cachés. Comment faire?

vous pouvez allumer dotglob :

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

pour désactiver dotglob , vous devez dire:

shopt -u dotglob
26
répondu devnull 2013-11-25 11:37:42

je pense que c'est le plus élégant, car il ne tente pas non plus de se déplacer .. :

mv /source/path/{.[!.],}* /destination/path
23
répondu Vanderstaaij 2017-02-06 09:24:52

solution Alternative plus simple est d'utiliser rsync utilité:

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

l'avantage est que le dossier original ( subfolder ) serait enlevé ainsi qu'une partie de la commande, et en utilisant mv exemples ici, vous avez encore besoin de nettoyer vos dossiers, sans parler de maux de tête supplémentaires pour couvrir les fichiers cachés et non cachés dans un seul motif.

en outre rsync fournit le soutien de la copie / déplacement les fichiers entre les télécommandes et il serait sûr que les fichiers sont copiés exactement comme ils étaient à l'origine ( -a ).

le paramètre utilisé -u sauterait les nouveaux fichiers existants, -r réapparaîtrait dans les répertoires et -v augmenterait la verbosité.

3
répondu kenorb 2015-05-27 23:07:12

laissez-moi vous présenter mon ami "dotglob". Il s'allume et s'é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

est par défaut"off".

$ shopt dotglob
dotglob         off

Il est préférable de le rallumer lorsque vous avez terminé, sinon vous permettra de confondre les choses que supposer qu'il sera éteint.

2
répondu TomOnTime 2013-11-25 11:46:01

en utilisant la commande find en conjonction avec la commande mv , vous pouvez empêcher la commande mv d'essayer de déplacer des répertoires (par exemple .. et . ) et des 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 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) inclut les . et. . dossiers et 3) manque des dossiers comme ..foobar,...barfoo, etc.

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

2
répondu teancum144 2015-07-16 15:25:16

ma solution pour ce problème quand je dois copier tous les fichiers (y compris . fichiers) dans un répertoire cible conserver les permissions est: (Remplacer si déjà existant)

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

yes est automatiquement écraser les fichiers de destination, r récursif, v verbose, p conserve les permissions.

noter que le le chemin source ne se termine pas avec un / (donc tous les fichiers/répertoire et . les fichiers sont copiés)

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

1
répondu Rajneesh Gadge 2018-01-30 20:46:59