Je suis sur le chemin:
/myuser/downloads/
Et je crée un sous-dossier:
/myuser/downloads/new
Maintenant, je veux déplacer tous les fichiers et dossiers/sous-dossiers du dossier de téléchargement vers le sous-dossier.
comment puis-je faire ceci?
J'ai essayé:
mv -R *.* new/
Mais le mouvement ne prend pas le commutateur -R semble-t-il.
La commande
mv !(new) new
devrait faire l'affaire. Si cela ne fonctionne pas, lancez d'abord shopt -s extglob
.
Pour déplacer également les fichiers/répertoires masqués (commençant par un point), exécutez également shopt -s dotglob
en premier.
Pour résumer:
shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob
(il est toujours préférable de désélectionner dotglob
pour éviter les mauvaises surprises).
J'ai trouvé quelque chose comme ça mais il est un peu plus simple à comprendre et cela pourrait bien fonctionner pour vous aussi:
ls | grep -v new | xargs mv -t new
Ajouter une explication à la solution ci-dessus:
À partir des pages de manuel:
mv -t
-t, --target-directory=DIRECTORY
move all SOURCE arguments into DIRECTORY
grep -v
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
Expliqué par étape:
ls
listera les fichiers du répertoire courantgrep -v new
retournera piped à ce qui ne correspond pas newxargs mv -t new
déplacera les fichiers qui y sont connectés de grep -v
vers le répertoire cibleIdée simple. En supposant que vous soyez dans / myuser, renommez téléchargements en nouvea, créez un nouveau répertoire téléchargements puis déplacez nouvea dedans.
mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.
Vous pouvez essayer ce processus alternatif –– rester dans le chemin
/myuser/downloads/
mais, au lieu de créer d'abord le répertoire /myuser/downloads/new/
, créez plutôt un dossier dans le répertoire /myuser/
, avec la commande mkdir ../new
, puis déplacez tous les fichiers de downloads
vers new
et finalement déplacez new
nom__ dans downloads
name__. Vous pouvez le faire sur une seule ligne, tandis que vous êtes dans le chemin /myuser/downloads/
, à l’aide de la commande suivante:
mkdir ../new && mv * ../new && mv ../new ../downloads
Dans ce cas, vous n'avez pas à vous soucier d'un quelconque "filtrage" des fichiers/dossiers, puisque new
se trouve au même niveau du chemin que downloads
name__, vous pouvez donc tout déplacer dans downloads
à new
name__, puis déplacer new
dans downloads`.
Toutefois, si le sous-dossier new
a déjà été créé et que vous ne souhaitez pas en créer un autre, ne vous inquiétez pas, changez simplement la commande mkdir
située à gauche du premier &&
dans la commande ci-dessus en une commande mv
name__, poussez new
dans le chemin; En d'autres termes, tant que vous êtes toujours dans /myuser/downloads/
, vous pouvez changer mkdir ../new
en mv new ..
. Ensuite, le sous-dossier new
[dans le chemin /myuser/downloads/new/
] est poussé jusqu'à /myuser/new/
, au même niveau que /myuser/downloads/
, et vous pouvez exécuter le reste de la commande comme indiqué ci-dessus. Tous ensemble, nous avons, à partir du chemin /myuser/downloads/
:
mv new .. && mv * ../new && mv ../new ../downloads
et puisque vous vouliez "déplacer tous les fichiers et dossiers/sous-dossiers du dossier de téléchargement vers le sous-dossier [new
name__]", vous avez terminé! Si vous vouliez déplacer niquement fichiers (ou niquement dossiers ou [insérer un mouvement d'objet plus granulaire]), vous devrez alors utiliser d'autres commandes pouvant "filtrer" objets, tels que grep
name__. Les commandes écrites ci-dessus sont cependant suffisantes.
Si vous souhaitez déplacer tous les fichiers d'un dossier vers l'un de ses sous-dossiers, vous pouvez utiliser la commande suivante:
find /myuser/downloads/ -type d -name 'new' -Prune -type f | xargs mv -t /myuser/downloads/new
Il trouvera tous les fichiers et les déplacera ensuite dans votre sous-dossier.
@waltinator: ajout de -type d -name 'new' -Prune
pour empêcher la traversée de /myuser/downloads/new
.