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?
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? )
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
Je pense que c'est le plus élégant, car il n'essaie pas non plus de bouger ..
:
mv /source/path/{.[!.],}* /destination/path
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é.
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.
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.
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.