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?
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? )
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
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
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é.
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.
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.
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.