Ich habe einen Ordner , A
die Dateien und Verzeichnisse hat, möchte ich alle diese Dateien und Verzeichnisse in einem anderen Ordner verschieben B
, mit der Ausnahme file
, file2
, directory
, und directory2
.
Wie kann das gemacht werden?
Ich habe einen Ordner , A
die Dateien und Verzeichnisse hat, möchte ich alle diese Dateien und Verzeichnisse in einem anderen Ordner verschieben B
, mit der Ausnahme file
, file2
, directory
, und directory2
.
Wie kann das gemacht werden?
Antworten:
Mit zsh
:
setopt extendedglob # best in ~/.zshrc
mv A/^(file|directory)(|2)(D) B/
( (D)
um Punkt (versteckte) Dateien einzuschließen).
Mit bash
:
shopt -s extglob dotglob failglob
mv A/!(@(file|directory)?(2)) B/
Mit ksh93
(FIGNORE='@(.|..|@(file|directory)?(2))'; mv A/* B)
was ich normalerweise mache
cd A
ls > a
(vorausgesetzt, Sie haben keine 'a'-Datei).
vi a
Entfernen Sie alle Dateien oder Verzeichnisse, die an Ort und Stelle bleiben sollen.
mv $(<a) B
-
. Sie können keine Dateinamen erkennen, die Zeilenumbrüche enthalten, und versteckte Dateien werden weggelassen.
ls
es sich um einen Alias für handelt ls -F
(was häufig der Fall ist, wenn keine Farben verwendet werden), können Quellpfade führen /
, was schwerwiegende Nebenwirkungen haben kann - siehe "Warnung" und "Nachgestellte Schrägstriche" in info mv
(oder pinfo mv
) aber nicht in man mv
)
Sie können find
mit ausgeschlossenen Ausdrücken verwenden:
find . ! -name . -prune ! -path ./file \
! -path ./file2 \
! -path ./directory \
! -path ./directory2 \
-exec mv {} your_destination \;
Diese Lösung ist von dieser Frage inspiriert .
-E
Option fallen lassen. Es kann jedoch Unterschiede zwischen unseren Systemen geben, da ich derzeit unter OSX arbeite.
Wenn ./A
und ./B
sich auf demselben Dateisystem befinden und wenn diese Dateien noch nicht vorhanden sind in ./B
:
file file2 directory directory2
... dann sollte diese Operation nur atomar sein:
cd ./A; mv * ../B
for mv in file file2 directory directory2
do mv ../B/"$mv" .
done
Ist dies nicht der Fall, werden mindestens 8 zusätzliche geräteübergreifende Kopien mit den oben genannten Befehlen erstellt.
mv
unlinks
und renames
wenn man keine Entwickler kreuzt, betrifft das im Grunde nur die Dentries, so wie ich es verstehe. Aber die Shell kommt nicht darauf an.
Sie können ein Bash-Array verwenden, um zu speichern, welche Sie überspringen möchten, und dann die hier gezeigte containsElement
Funktion verwenden :
$ skiplist=(file file2 directory directory2)
$ for f in *; do if containsElement "$f" "${skiplist[@]}"; then continue; fi;
mv -v "$f" B; done