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
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/
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
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
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.
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
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.
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.
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
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.
Man kann grep wie folgt überspringen:
ls ~/Linux/Old/ -Q1I Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
Wie wäre es mit:
mv $(echo * | sed s:Tux.png::g) ~/Linux/New/
Sie müssen jedoch im Ordner sein.