Comment déplacer tous les fichiers du répertoire courant au répertoire supérieur ?
Comment déplacer tous les fichiers du répertoire courant au répertoire supérieur dans linux ?
J'ai essayé quelque chose comme mv *.*
, mais ça ne fonctionne pas.
Comment déplacer tous les fichiers du répertoire courant au répertoire supérieur dans linux ?
J'ai essayé quelque chose comme mv *.*
, mais ça ne fonctionne pas.
La commande que vous recherchez est
mv * .[^.]* ..
ou (voir ci-dessous pour plus d'informations) :
(shopt -s dotglob; mv -- * ..)
Explication : la commande mv
déplace des fichiers et des répertoires. Le dernier argument de mv
est la cible (dans ce cas, le répertoire à une étape “en haut” de l'arbre, ..
). Les arguments précédents sont les fichiers et répertoires sources. L'astérisque (*
) est un joker qui correspond à tous les fichiers qui ne commencent pas par un point. Les fichiers qui commencent par un point (dotfiles) sont “cachés”. Ils sont mis en correspondance à l'aide du modèle .[^.]*
(voir édition ci-dessous).
Voir la page de manuel que j'ai liée pour plus d'informations sur mv
.
.[^.]*
au lieu de .*
?Comme Chris Johnsen le souligne correctement : le modèle .*
correspond également à .
et ..
. Comme vous ne voulez pas (et ne pouvez pas) les déplacer, il vaut mieux utiliser un modèle qui correspond à n'importe quel nom de fichier commençant par un point à l'exception de ces deux-là. Le modèle .[^.]*
fait exactement cela : il correspond à n'importe quel nom de fichier (1) commençant par un point (2) suivi d'un caractère qui n'est pas un point (3) suivi de zéro ou de plusieurs caractères arbitraires.
Comme Paggas fait remarquer , il faudrait aussi ajouter le motif .??*
pour faire correspondre les fichiers commençant par deux points. Voir sa réponse pour une solution alternative utilisant find
.
La réponse d'Arjan mentionne shopt
afin d'éviter tous ces problèmes avec les fichiers pointillés. Mais il y a toujours le problème des fichiers commençant par un tiret. Et cela nécessite trois commandes. J'aime quand même l'idée. Je propose de l'utiliser comme ceci :
(shopt -s dotglob; mv -- * ..)
Cela exécute shopt
dans une sous-coque (donc pas de deuxième appel à shopt
nécessaire) et utilise --
de sorte que les fichiers commençant par un tiret ne seront pas interprétés comme des arguments de mv
.
Réponse courte : utilisez
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Réponse longue :
La commande
mv * .* ..
ne fonctionnera pas puisque .*
peut correspondre à .
et ..
. Mais la commande
mv * .[^.]* ..
ne fonctionnera pas non plus, puisque .[^.]*
ne correspondra pas, par exemple, à ..filename
! Au lieu de cela, ce que je fais est
mv * .[^.] .??* ..
qui correspondra à tout sauf à .
et ..
. *
correspondra à tout ce qui ne commence pas par un .
, .[^.]
correspondra à tous les noms de fichiers de 2 caractères commençant par un point sauf ..
, et .??*
correspondra à tous les noms de fichiers commençant par un point avec au moins 3 caractères.
Mieux encore, vous pouvez utiliser
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
qui évite les horribles piratages de globes dans mv * .[^.] .??* ..
!
Le mv n'a pas la fonctionnalité de déplacement des fichiers cachés lorsqu'il utilise *
- alors pourquoi ne pas utiliser la copie à la place ?
cp -rf . ..
rm -rf *
Pas besoin de se lancer dans des solutions complexes de dotglobbing et d'utilisation des commandes find.
rsync -a --remove-source-files . ..
rsync
est un outil de copie de fichiers extrêmement puissant, généralement utilisé pour effectuer des sauvegardes incrémentales à distance et des miroirs efficaces.
Avec la commande ci-dessus, nous disons à rsync
de copier le contenu de .
dans ..
Le commutateur -a
permet la récursion dans les sous-répertoires de .
et active quelques autres options courantes.
Le commutateur --remove-source-files
indique à rsync de supprimer les fichiers sources après une copie réussie, c'est-à-dire qu'il fait en sorte que rsync se comporte de la même manière que la commande mv
.
Cette commande minimisée fonctionne sur la plupart des shells modernes :
\mv -- {,.{[^.],??}}* ..
Autrement dit, c'est une solution portable :
\mv -- * .[^.] .??* ..
Caractéristiques:
\ empêche les alias d'altérer mv de manière indésirable.
– empêche les noms de fichiers contenant des traits d'union principaux (-xyz) d'être interprétés comme des arguments de ligne de commande.
.[^.] correspond à tous les noms de fichiers de deux caractères commençant par . sauf …
… correspond à tous les autres noms de fichiers de trois caractères ou plus.
Implémentations naïves:
Ce qui suit ignore les noms de fichiers UNIX cachés, ceux qui commencent par . (.bashrc).
Ce qui suit correspond à .. qui tente récursivement de déplacer chaque répertoire éventuellement jusqu'à / dans .. du répertoire de travail actuel ($PWD ou pwd). Ne jamais utiliser.
En fin de compte, essayer mv .
échouera car mv ne pourra pas délier le répertoire dans lequel vous êtes actuellement. Vous pourriez mv * ..
pour déplacer les fichiers dans le cwd.
Il est plus correct d'utiliser le modèle * .[!.] .??*
que * .[^.] .??*
puisque le premier fonctionnera également avec des shells plus anciens tels que ksh88 :
mv -- * .[!.] .??* ..
--
évite les problèmes lorsque vous avez un nom de fichier qui commence par -
*
correspond à tous les noms de fichiers qui ne commencent pas par .
.
que vous pouvez/doit déplacer .[!.]
correspond aux deux noms de fichiers à caractères qui commencent par .
.??*
correspond aux trois noms de fichiers à caractères (ou plus) qui commencent par .
Avec ksh88, le modèle de nom de fichier .[^.]
correspondra en fait aux noms de fichier ..
(qui existe toujours) et .^
(qui n'existe probablement pas), ce qui aura un effet contraire à celui souhaité.
mv * .??* ../.
*
récupère tous les fichiers non-points. .??*
récupère tous les fichiers . d'une longueur d'au moins trois octets, ce qui fonctionne pour tous les fichiers légitimes. Tout ce qui reste, vous le voulez probablement à rm
plutôt qu'à mv
de toute façon.
Le ../.
n'offre pas d'avantages directs par rapport au ..
mais quand on fait un déplacement vers un répertoire, c'est une très bonne habitude à prendre, car il échouera, comme vous le souhaitez, s'il y a quelque chose qui ne va pas avec le chemin. Par exemple, mv xyz bletch
, où vous pensez bletch
est un répertoire, peut être rendu plus certain avec mv xyz bletch/.
.
Trouver et comprendre le travail aussi. Ce type de structure peut être utile si vous souhaitez sélectionner des fichiers sur des critères plus complexes en modifiant find et egrep.
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
Je pense que la solution la plus simple pour déplacer tous les fichiers vers leur répertoire parent serait
mv "`ls`" ../
ou, s'il y a des fichiers/répertoires cachés
utiliser :
mv "`ls -a`" ../ 2>/dev/null
Aussi, disons que vous voulez déplacer le contenu d'un dossier vers un de ses répertoires internes, par exemple
utiliser :
mv "`ls -a`" /tony 2>/dev/null
Note:
"`ls -a`"
Pour déplacer les fichiers qui contiennent des espaces.
2>/dev/null
est pour supprimer l'avertissement/erreur parce que ls -a
imprimerait le dossier .
et ..
aussi et vous ne pouvez pas les déplacer ou les copier. Donc pour ces dossiers, il y aura une erreur (si nous n'utilisons pas 2>/dev/null) qui fera qu'il ne pourra pas les déplacer et le reste sera déplacé assez confortablement.
Il vaut mieux éviter ls -a
s'il n'y a pas de fichiers cachés et utiliser simplement ls
.