web-dev-qa-db-fra.com

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 vieux trucs vers un nouveau truc-dossier sauf Tux.png ! -sign représente une négation. Y at-il un outil pour le travail?

Mettez ce qui suit à votre .bashrc 

shopt -s extglob

Il étend les expressions rationnelles . Vous pouvez alors déplacer tous les fichiers sauf un par

mv !(fileOne) ~/path/newFolder

Exceptions par rapport aux autres commandes

Notez que, lors de la copie de répertoires, le flash avant ne peut pas être utilisé dans le nom comme indiqué dans le fil de discussion Pourquoi extglob sauf Break, sauf condition? :

cp -r !(Backups.backupdb) /home/masi/Documents/

donc Backups.backupdb/ est faux ici avant la négation et je ne l’utiliserais pas non plus dans les répertoires mobiles en raison du risque que l’on utilise mal alors des objets globaux avec d’autres commandes et d’autres exceptions possibles.

Si vous utilisez bash et que l'option extglob Shell est définie (ce qui est généralement le cas):

mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
122
sth

J'irais avec la méthode traditionnelle find & xargs:

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 | 
    xargs -0 mv -t ~/Linux/New

-maxdepth 1 empêche la recherche récursive. Si vous ne vous souciez que des fichiers, vous pouvez dire -type f. -mindepth 1 fait qu'il n'inclut pas le chemin ~/Linux/Old lui-même dans le résultat. Fonctionne avec tous les noms de fichiers, y compris ceux contenant des sauts de ligne intégrés. 

Un commentaire indique que l'option mv -t est probablement une extension GNU. Pour les systèmes qui ne l'ont pas

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \
    -exec mv '{}' ~/Linux/New \;
65

Un moyen rapide serait de modifier le nom de fichier Tux afin que votre commande de déplacement ne corresponde pas.

Par exemple:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png
20
John T

Je pense que la meilleure façon de faire est avec des backticks

mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

Modifier:

Utilisez plutôt une barre oblique inversée avec ls pour éviter de l’utiliser avec un alias, c’est-à-dire que ls est généralement alias en tant que ls --color.

mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

Merci à Arnold Roa

14
Rohail Abbas

Pour bash, sth answer est correct. Voici la syntaxe zsh (mon shell de choix):

mv ~/Linux/Old/^Tux.png ~/Linux/New/

Nécessite que l'option EXTENDED_GLOB Shell soit définie.

13
Juliano

Je trouve cela un peu plus sûr et plus facile à utiliser pour les déplacements simples excluant certains fichiers ou répertoires.

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
12
alex.pilon

Ce qui suit n'est pas une méthode garantie à 100%, et ne devrait pas du tout être tenté pour le script. Mais parfois, il est suffisant pour une utilisation interactive rapide de Shell. Un fichier fichier glob comme

[abc]*

(qui correspondra à tous les fichiers dont le nom commence par a, b ou c) peut être annulé en insérant d’abord un caractère "^", c.-à-d. 

[^abc]*

J'utilise parfois ceci pour ne pas correspondre au répertoire "lost + found", comme par exemple:

mv /mnt/usbdisk/[^l]* /home/user/stuff/.

Bien sûr, s’il existe d’autres fichiers commençant par l, je dois les traiter ultérieurement.

5
hlovdal
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New

La commande find répertorie tous les fichiers normaux et la commande fgrep filtre tout fichier Tux.png. Les backticks indiquent à mv de déplacer la liste de fichiers résultante.

4
David Norman
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
3
aitor

Que diriez-vous de tout déplacer dans le dossier, puis de déplacer Tux.png en arrière?

Je ne peux penser à aucune syntaxe de Shell pour dire "tout sauf ..." de manière désinvolte. 

2
David Z

On peut sauter grep comme ceci:

ls ~/Linux/Old/ -Q1I Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
2
Arch Linux Tux

Que diriez-vous:

mv $(echo * | sed s:Tux.png::g) ~/Linux/New/

Vous devez cependant être dans le dossier.

0
antibus