2009-10-28 18:54:06 +0000 2009-10-28 18:54:06 +0000
134
134

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.

Réponses (11)

204
204
204
2009-10-28 19:01:58 +0000

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.


Pourquoi .[^.]* 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.

45
45
45
2009-10-28 20:19:07 +0000

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 * .[^.] .??* .. !

14
14
14
2009-10-28 20:52:27 +0000

Par souci d'exhaustivité, on peut également demander au shell Bash d'inclure des fichiers cachés, en utilisant shopt :

shopt -s dotglob
mv -- * ..
shopt -u dotglob
8
8
8
2011-08-02 20:46:48 +0000

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.

7
7
7
2013-01-20 11:47:53 +0000
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.

2
2
2
2011-08-12 08:12:49 +0000

Cette commande minimisée fonctionne sur la plupart des shells modernes :

\mv -- {,.{[^.],??}}* ..

Autrement dit, c'est une solution portable :

\mv -- * .[^.] .??* ..

Caractéristiques:

  1. \ empêche les alias d'altérer mv de manière indésirable.

  2. – 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.

  3. .[^.] correspond à tous les noms de fichiers de deux caractères commençant par . sauf …

  4. … correspond à tous les autres noms de fichiers de trois caractères ou plus.

Implémentations naïves:

  1. Ce qui suit ignore les noms de fichiers UNIX cachés, ceux qui commencent par . (.bashrc).

  2. 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.

2
2
2
2009-10-28 18:59:46 +0000

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.

2
2
2
2013-10-22 22:24:11 +0000

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 .
  • il n'y a pas de noms de fichiers à caractère unique qui commencent 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é.

2
2
2
2009-10-28 19:47:28 +0000
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/..

0
0
0
2014-05-12 23:08:11 +0000

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> ..
0
0
0
2014-08-06 16:37:16 +0000

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.