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?

118
demandé sur Costique 2009-03-22 05:44:38

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/
119
répondu sth 2009-03-22 02:53:55

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.

81
répondu Léo Léopold Hertz 준영 2017-05-23 10:31:17

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 \;
64
répondu Johannes Schaub - litb 2009-03-22 05:45:18

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
18
répondu John T 2009-03-22 03:28:42

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.

13
répondu Juliano 2017-05-23 12:10:31

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

12
répondu Rohail Abbas 2017-01-12 15:24:40

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
11
répondu alex.pilon 2011-04-29 13:56:45

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.

5
répondu hlovdal 2009-03-29 00:40:33
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.

4
répondu David Norman 2009-03-22 02:55:17
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
3
répondu aitor 2014-12-16 11:06:51

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.

2
répondu David Z 2009-03-22 02:50:40

On peut "151920920 ignorer" grep comme ceci:

ls ~/Linux/Old/ -Q1I Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
1
répondu Arch Linux Tux 2018-06-25 18:28:54