it-swarm.com.de

Verschieben Sie alle Dateien außer einer

Wie kann ich alle Dateien außer einer verschieben? Ich suche nach etwas wie: 

'mv ~/Linux/Old/!Tux.png ~/Linux/New/'

wo ich alte Sachen in neuen Sachen -Ordner verschiebe, außer Tux.png. ! -sign steht für eine Negation. Gibt es ein Werkzeug für den Job?

Fügen Sie Folgendes in Ihre .bashrc ein 

shopt -s extglob

Es erweitert die Regexes . Sie können dann alle Dateien außer einer verschieben

mv !(fileOne) ~/path/newFolder

Ausnahmen in Bezug auf andere Befehle

Beachten Sie, dass beim Kopieren von Verzeichnissen das Forward-Flash nicht in dem Namen verwendet werden kann, wie es im Thread Why extglob mit Ausnahme der Bedingung "break" angegeben wird. :

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

daher ist Backups.backupdb/ hier vor der Negation falsch, und ich würde es auch nicht zum Verschieben von Verzeichnissen verwenden, da die Gefahr besteht, dass dann falsch mit anderen Befehlen und möglichen anderen Ausnahmen gearbeitet wird.

Wenn Sie bash verwenden und die Option extglob Shell gesetzt haben (was normalerweise der Fall ist):

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

Ich würde mit dem traditionellen find & xargs Weg gehen:

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

-maxdepth 1 macht keine rekursive Suche. Wenn Sie sich nur für Dateien interessieren, können Sie -type f sagen. -mindepth 1 lässt den ~/Linux/Old-Pfad selbst nicht in das Ergebnis einschließen. Funktioniert mit beliebigen Dateinamen, auch mit Dateinamen, die eingebettete Zeilenumbrüche enthalten. 

Ein Kommentar stellt fest, dass die mv -t-Option wahrscheinlich eine Erweiterung von GNU ist. Für Systeme, die es nicht haben

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

Eine schnelle Möglichkeit wäre, den Tux-Dateinamen so zu ändern, dass der Befehl zum Verschieben nicht übereinstimmt.

Zum Beispiel:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png
20
John T

Ich denke, der einfachste Weg ist Backticks

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

Bearbeiten:

Verwenden Sie stattdessen einen umgekehrten Schrägstrich mit ls, um die Verwendung mit Alias ​​zu verhindern, d. H. Meistens wird ls als ls --color als Alias ​​bezeichnet.

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

Vielen Dank @Arnold Roa

14
Rohail Abbas

Für Bash ist sth answer richtig. Hier ist die zsh (meine bevorzugte Shell) -Syntax:

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

Die EXTENDED_GLOB Shell-Option muss gesetzt sein.

13
Juliano

Ich finde, dass dies ein bisschen sicherer und einfacher für einfache Bewegungen ist, die bestimmte Dateien oder Verzeichnisse ausschließen.

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

Das Folgende ist keine zu 100% garantierte Methode und sollte keinesfalls für das Scripting versucht werden. Manchmal ist es jedoch gut genug für eine schnelle, interaktive Shell-Verwendung. Eine Datei Datei Glob wie

[abc]*

(was zu allen Dateien passt, deren Namen mit a, b oder c beginnen), kann negiert werden, indem zuerst ein Zeichen "^" eingefügt wird, d. h. 

[^abc]*

Ich verwende dies manchmal, um nicht mit dem Verzeichnis "lost + found" übereinzustimmen, wie zum Beispiel:

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

Wenn es andere Dateien gibt, die mit l anfangen, muss ich diese anschließend bearbeiten.

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

Der Befehl find listet alle regulären Dateien auf und der Befehl fgrep filtert Tux.png aus. Die Backticks weisen mv an, die resultierende Dateiliste zu verschieben.

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

Wie wäre es, wenn Sie alles im Ordner verschieben und dann Tux.png zurückschieben?

Ich kann mir keine Shell-Syntax vorstellen, die "alles außer ..." ohne weiteres sagt. 

2
David Z

Man kann grep wie folgt überspringen:

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

Wie wäre es mit:

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

Sie müssen jedoch im Ordner sein.

0
antibus