/ / Verschieben Sie alle Dateien außer one - linux, bash, glob

Verschieben Sie alle Dateien außer einem - linux, bash, glob

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 neue Sachen-Ordner ausser verschieben Tux.png. ! -sign steht für eine Negation. Gibt es ein Werkzeug für den Job?

Antworten:

116 für die Antwort № 1

Wenn Sie bash benutzen und die extglob Shell-Optionssatz (was normalerweise der Fall ist):

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

80 für die Antwort № 2

Fügen Sie Folgendes in Ihre .bashrc ein

shopt -s extglob

Es erstreckt sich Regex. Sie können dann alle Dateien mit Ausnahme von 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 er im Thread bemerkt wird Warum Extglob außer Brechen außer Bedingung?:

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

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


64 für die Antwort № 3

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 es nicht rekursiv suchen. Wenn Sie sich nur für Dateien interessieren, können Sie sagen -type f. -mindepth 1 macht es nicht das ~/Linux/Old Pfad selbst in das Ergebnis. Funktioniert mit beliebigen Dateinamen, auch mit Dateinamen, die eingebettete Zeilenumbrüche enthalten.

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

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

16 für die Antwort № 4

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

Beispielsweise:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png

13 für die Antwort № 5

Für Bash etw antworten ist richtig. Hier ist der zsh (meine Shell nach Wahl) Syntax:

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

Benötigt EXTENDED_GLOB Shell-Option eingestellt werden.


11 für die Antwort № 6

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

11 für die Antwort № 7

Ich denke, der einfachste Weg ist Backticks

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

Bearbeiten:

Verwenden Sie stattdessen einen Backslash mit ls, um die Verwendung mit Alias ​​zu verhindern, d.

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

Danke, @Arnold Roa


5 für die Antwort № 8

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-Nutzung. 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]*

Manchmal verwende ich dies, um nicht mit dem Verzeichnis "lost + found" übereinzustimmen, wie beispielsweise

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

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


3 für die Antwort № 9
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.


3 für die Antwort № 10
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/"

2 für die Antwort № 11

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

Ich kann mir keine Shell-Syntax vorstellen, um "alles außer ..." zu sagen.


1 für die Antwort № 12

Man kann überspringen grep so was:

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