Déplacer tous les fichiers sauf un
Comment puis-je déplacer tous les fichiers sauf un? Je cherche quelque chose comme:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
où je déplace les vieilles choses vers les nouvelles choses-dossier à l'exception de Tux.png
. !-signe représente une négation. Est-il un outil pour le travail?
12 réponses
si vous utilisez bash et que vous avez l'option shell extglob
(ce qui est habituellement le cas):
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
mettez ce qui suit à votre .bashrc
shopt -s extglob
il étend regexes. Vous pouvez ensuite déplacer tous les fichiers sauf par
mv !(fileOne) ~/path/newFolder
Exceptions par rapport aux autres commandes
notez que, dans les répertoires de copie, l'avant-flash ne peut pas être utilisé dans le nom comme noté dans le thread pourquoi extglob sauf rupture sauf condition? :
cp -r !(Backups.backupdb) /home/masi/Documents/
donc Backups.backupdb/
est erroné ici avant la négation et je ne l'utiliserais pas non plus dans le déplacement des répertoires à cause du risque d'utiliser à tort puis globs avec d'autres commandes et d'autres exceptions possibles.
je voudrais aller avec la traditionnelle trouver et xargs:
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 |
xargs -0 mv -t ~/Linux/New
-maxdepth 1
la rend impropre à la recherche. Si vous ne vous souciez que des fichiers, vous pouvez dire -type f
. -mindepth 1
fait qu'il ne comprend pas le chemin ~/Linux/Old
lui-même dans le résultat. Fonctionne avec tous les noms de fichiers, y compris ceux qui contiennent des nouvelles lignes intégrées.
un commentaire note que l'option mv -t
est probablement une extension GNU. Pour les systèmes qui Je ne l'ai pas
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \
-exec mv '{}' ~/Linux/New \;
un moyen rapide serait de modifier le nom du fichier tux afin que votre commande move ne corresponde pas.
par exemple:
mv Tux.png .Tux.png
mv * ~/somefolder
mv .Tux.png Tux.png
Pour bash, qqch réponse est correct. Voici la syntaxe zsh (mon shell de choix):
mv ~/Linux/Old/^Tux.png ~/Linux/New/
nécessite que l'option shell EXTENDED_GLOB
soit définie.
je pense que la façon la plus facile de faire est avec des bâtons
mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
Edit:
utilisez backslash avec ls à la place pour empêcher de l'utiliser avec alias, c'est-à-dire que la plupart du temps ls est Alias comme ls --color.
mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
Merci @ Arnold Roa
je trouve que c'est un peu plus sûr et plus facile à utiliser pour des mouvements simples qui excluent certains fichiers ou répertoires.
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
ce qui suit n'est pas une méthode garantie à 100%, et ne doit pas du tout être tenté pour les scripts. Mais quelques fois c'est assez bon pour rapide shell interactif d'utilisation. Un fichier glob comme
[abc]*
(qui fera correspondre tous les fichiers avec des noms commençant par a, b ou c) peut être annulé en insérant un caractère " ^ "en premier, i.e.
[^abc]*
Je l'utilise parfois pour ne pas correspondre au répertoire "lost+found", comme par exemple:
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
bien sûr, s'il y a d'autres fichiers commençant par l, je dois les traiter par la suite.
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New
la commande find liste tous les fichiers réguliers et la commande fgrep filtre tous les Tux.png. Les barres obliques indiquent à mv de déplacer la liste des fichiers résultants.
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
et si tu bougeais tout dans le dossier et que tu bougeais juste Tux.png de retour?
Je ne vois pas de syntaxe shell pour dire" tout sauf ..."désinvolte.
On peut "151920920 ignorer" grep comme ceci:
ls ~/Linux/Old/ -Q1I Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/