Comment déplacer tous les fichiers du répertoire actuel vers le répertoire supérieur de linux?
J'ai essayé quelque chose comme ça mv *.*
, mais ça ne marche pas.
Comment déplacer tous les fichiers du répertoire actuel vers le répertoire supérieur de linux?
J'ai essayé quelque chose comme ça mv *.*
, mais ça ne marche pas.
Réponses:
La commande que vous recherchez est
mv * .[^.]* ..
ou (voir ci-dessous pour plus d'informations):
(shopt -s dotglob; mv -- * ..)
Explication: la mv
commande déplace des fichiers et des répertoires. Le dernier argument de mv
est la cible (dans ce cas, le répertoire un pas "en haut" dans l'arborescence ..
). Les arguments précédents sont les fichiers source et les répertoires. L'astérisque ( *
) est un caractère générique qui correspond à tous les fichiers qui ne commencent pas par un point. Les fichiers commençant par un point (fichiers de points) sont "cachés". Ils sont appariés en utilisant le motif .[^.]*
(voir édition ci-dessous).
Voir la page de manuel que j'ai liée pour plus d'informations mv
.
.[^.]*
au lieu de .*
?Comme Chris Johnsen souligne à juste titre : le modèle .*
correspond également .
et ..
. Puisque vous ne voulez pas (et ne pouvez pas) les déplacer, il est préférable d'utiliser un modèle qui correspond à tout nom de fichier commençant par un point sauf ces deux . Le modèle .[^.]*
ne fait que 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 souligne , il faudrait aussi ajouter le modèle .??*
afin de faire correspondre les fichiers commençant par deux points. Voir sa réponse pour une solution alternative en utilisant find
.
La réponse d'Arjan mentionne shopt
pour éviter tous ces problèmes avec les fichiers de points. Mais il reste le problème des fichiers commençant par un tiret. Et cela nécessite trois commandes. Pourtant, j'aime bien l'idée. Je propose de l'utiliser comme ceci:
(shopt -s dotglob; mv -- * ..)
Ceci s'exécute shopt
dans un sous-shell (donc pas de deuxième appel à shopt
requis) et utilise --
pour que les fichiers commençant par un tiret ne soient pas interprétés comme des arguments mv
.
.*
peut provoquer que mv produise des avertissements / des erreurs indiquant qu'il est impossible de déplacer .
et ..
. Vous pourriez essayer à la mv * .[^.]* ..
place.
*
, .[^.]*
et ..?*
. La seconde peut-être .[!.]*
pour les coquilles plus anciennes (POSIX). Lire aussi
Réponse courte: utiliser
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Longue réponse:
La commande
mv * .* ..
ne fonctionnera pas car .*
peut correspondre .
et ..
. Mais la commande
mv * .[^.]* ..
ne fonctionnera pas non plus, car .[^.]*
ne correspondra pas, par exemple ..filename
! Au lieu de cela, ce que je fais est
mv * .[^.] .??* ..
qui correspondra à tout sauf .
et ..
. *
correspond à tout ce qui ne commence pas par un .
, .[^.]
correspond à tous les noms de fichiers de 2 caractères commençant par un point sauf ..
, et .??*
correspond à tous les noms de fichiers commençant par un point d'au moins 3 caractères.
Mieux encore, vous pouvez utiliser
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
qui évite les horribles hacks glob dans mv * .[^.] .??* ..
!
..?*
à mon commentaire et vous en aviez déjà pris soin.
mv
d'arrêter de chercher d'autres options de commande. Les accolades sont un nom de fichier résultant. Le signe plus indique au lieu d'exécuter exec par résultat (c'est-à-dire par nom de fichier), placez autant de résultats que possible dans un seul exec. Par souci d'exhaustivité, -t..
indique à move de déplacer la destination cible vers laquelle déplacer tous ces fichiers.
Juste pour être complet, on peut aussi dire au shell Bash d'inclure des fichiers cachés, en utilisant shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob
Le mv n'a pas la fonctionnalité de déplacement de fichiers cachés lors de l'utilisation *
- alors pourquoi ne pas utiliser la copie à la place?
cp -rf . ..
rm -rf *
Pas besoin d'entrer dans les solutions complexes de dotglobbing et d'utiliser des commandes de recherche.
cp
et rm
au lieu de cela, vous copiez vraiment tout.
rsync -a --remove-source-files . ..
rsync
est un outil de copie de fichiers extrêmement puissant, généralement utilisé pour effectuer des sauvegardes et des miroirs incrémentiels efficaces à distance.
Avec la commande ci-dessus, nous demandons rsync
de copier le contenu de .
dans..
Le commutateur -a
active la récursion dans les .
sous-répertoires et active d'autres options courantes.
Le commutateur --remove-source-files
demande à rsync de supprimer les fichiers source après une copie réussie, c’est-à-dire qu’il fait se comporter de la même manière que la mv
commande.
--remove-source-files
cela ne supprimera pas les annuaires (synchronisés).
-bash: /bin/mv: Argument list too long
erreur. Celui-ci fonctionne comme le charme.
En fin de compte, les tentatives mv .
échoueront car mv ne pourra pas dissocier le répertoire dans lequel vous vous trouvez. Vous pouvez mv * ..
déplacer les fichiers dans le dossier de cwd.
mv * .??* ../.
*
obtient tous les fichiers non-point. .??*
obtient tout. fichiers au moins trois octets de long, ce qui fonctionne pour tous les légitimes. Tout ce que vous voulez, vous voulez probablement rm
plutôt que de mv
toute façon.
La ../.
n'offre aucun avantage direct sur ..
mais en faisant un mouvement à ce répertoire est une très bonne habitude à prendre, car il échouera, comme vous voulez, s'il y a quelque chose de mal avec le chemin. Par exemple, mv xyz bletch
lorsque vous pensez bletch
être un répertoire, vous pouvez en savoir plus avec mv xyz bletch/.
.
.[^.]
pour obtenir des fichiers de couverture comme .a
.
Cette commande minimisée fonctionne sur la plupart des coques modernes:
\mv -- {,.{[^.],??}}* ..
Sinon mentionné est une solution portable:
\mv -- * .[^.] .??* ..
Fonctionnalités:
\ empêche les alias de modifier mv de manière indésirable.
- empêche les noms de fichiers contenant des tirets (-xyz) d'être interprétés comme des arguments de ligne de commande.
. [^.] correspond aux 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).
mv * ..
Les correspondances suivantes .. qui tentent de manière récursive de déplacer tous les répertoires éventuellement jusqu’à / dans .. du répertoire de travail en cours ($ PWD ou pwd). Ne jamais utiliser.
mv .* ..
Il est plus correct d'utiliser ce modèle * .[!.] .??*
que * .[^.] .??*
celui-ci fonctionnant également avec les anciens shell 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 un .
.
que vous pouvez / devez déplacer.[!.]
correspond à tous les noms de fichier de deux caractères qui commencent par un .
.??*
correspond aux noms de fichiers à trois caractères (ou plus longs) commençant par un .
Avec ksh88, le modèle de nom de fichier correspond .[^.]
en fait aux noms de fichier ..
(qui existent toujours) et .^
(qui n'existe probablement pas), ce qui a un effet opposé à celui souhaité.
Trouve et travaille 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 dans son répertoire parent. serait
mv "`ls`" ../
ou, s'il y a des fichiers / répertoires cachés
utilisation:
mv "`ls -a`" ../ 2>/dev/null
En outre, supposons que vous souhaitiez déplacer le contenu d’un dossier dans l’un de ses dossiers internes (par exemple)
utilisation:
mv "`ls -a`" /tony 2>/dev/null
Remarque:
"`ls -a`"
Pour déplacer les fichiers contenant des espaces.
2>/dev/null
Permet de supprimer l'avertissement / l'erreur, car ls -a
le dossier .
et sera également imprimé ..
et vous ne pouvez ni les déplacer ni les copier. Donc, pour ces dossiers, une erreur s’affichera (si nous n’utilisons pas 2> / dev / null), il ne pourra pas les déplacer et le reste sera déplacé assez facilement.
Il est préférable d'éviter ls -a
s'il n'y a pas de fichiers cachés et simplement de les utiliser ls
.
mv $(ls -a)
? Cela taperait sur le répertoire en cours et le répertoire en dessous de celui-ci, car ls -a
affichera ..
également.
mv ls -a ../
cela aurait également fonctionné selon les besoins. Oui, il affichera ces erreurs comme indiqué ci-dessus, mais à part cela, il déplacera les dossiers / fichiers requis dans le répertoire parent.
ls
commande pour déplacer les fichiers avec des espaces. J'ai apporté les modifications requises. Merci d'avoir signalé.
[linux] [mv] [cwd] [files]
, ou quelque chose de similaire?