/ / Przenieś wszystkie pliki oprócz jednego - linux, bash, glob

Przenieś wszystkie pliki poza jednym - linux, bash, glob

Jak mogę przenieść wszystkie pliki poza jednym? Szukam czegoś takiego jak:

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

gdzie przenoszę stare rzeczy do nowych rzeczy - z wyjątkiem folderu Tux.png. ! -sign reprezentuje negację. Czy jest jakieś narzędzie do pracy?

Odpowiedzi:

116 za odpowiedź nr 1

Jeśli używasz bash i masz extglob zestaw opcji powłoki (co zwykle ma miejsce):

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

80 dla odpowiedzi nr 2

Umieść poniższe w pliku .bashrc

shopt -s extglob

Rozciąga wyrazy regularne. Następnie możesz przenieść wszystkie pliki oprócz jednego przez

mv !(fileOne) ~/path/newFolder

Wyjątki w stosunku do innych poleceń

Zauważ, że w kopiowaniu katalogów, lampa błyskowa do przodu nie może być użyta w nazwie, jak zauważono w wątku Po co rozszerzać, z wyjątkiem łamania z wyjątkiem warunku?:

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

więc Backups.backupdb/ jest tutaj źle przed negacją i nie użyłbym go ani w ruchomych katalogach z powodu ryzyka niewłaściwego użycia globów z innymi poleceniami i ewentualnymi innymi wyjątkami.


64 dla odpowiedzi nr 3

Poszedłbym z tradycyjnym sposobem find & xargs:

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

-maxdepth 1 sprawia, że ​​nie jest rekursywnie wyszukiwana. Jeśli zależy ci tylko na plikach, możesz powiedzieć -type f. -mindepth 1 sprawia, że ​​nie obejmuje to ~/Linux/Old skieruj się do wyniku. Działa z dowolnymi nazwami plików, w tym z tymi, które zawierają osadzone znaki nowej linii.

Jeden komentarz zauważa, że ​​mv -t opcja to prawdopodobnie rozszerzenie GNU. Dla systemów, które go nie mają

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

16 dla odpowiedzi № 4

Szybkim sposobem byłoby zmodyfikowanie nazwy pliku, aby polecenie move nie pasowało.

Na przykład:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png

13 dla odpowiedzi nr 5

Dla basha, odpowiedź jest poprawne. Tutaj jest zsh (moja skorupa wyboru) składnia:

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

Wymaga EXTENDED_GLOB opcja powłoki do ustawienia.


11 dla odpowiedzi № 6

Uważam, że jest to trochę bezpieczniejsze i łatwiejsze do oparcia się na prostych ruchach, które wykluczają określone pliki lub katalogi.

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET

11 dla odpowiedzi № 7

Myślę, że najprościej zrobić to z backtickami

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

Edytować:

Zamiast tego użyj odwrotnego ukośnika z ls, aby uniemożliwić używanie go z aliasem, tzn. Przeważnie ls ma alias jako ls --color.

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

Dzięki @Arnold Roa


5 dla odpowiedzi № 8

Poniższy tekst nie jest metodą gwarantowaną w 100% i nie należy w ogóle podejmować prób tworzenia skryptów. Ale czasami jest wystarczająco dobre do szybkiego korzystania z powłoki interaktywnej. Plik globalny podobny do

[abc]*

(które będzie pasować do wszystkich plików o nazwach zaczynających się od a, b lub c) można zanegować, najpierw wstawiając znak "^", tj.

[^abc]*

Czasami używam tego, aby nie pasować do katalogu "lost + found", na przykład:

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

Oczywiście, jeśli istnieją inne pliki zaczynające się od l, muszę je potem przetworzyć.


3 dla odpowiedzi № 9
mv `find Linux/Old "!" -type d | fgrep -v Tux.png` Linux/New

Polecenie find wyświetla wszystkie zwykłe pliki, a polecenie fgrep odfiltrowuje dowolny Tux.png. Cofnięcia wskazują mv, aby przesunąć wynikową listę plików.


3 dla odpowiedzi № 10
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/"

2 dla odpowiedzi № 11

Co powiesz na przeniesienie wszystkiego do folderu, a następnie powrót do Tux.png?

Nie mogę myśleć o jakiejkolwiek składni powłoki, by powiedzieć "wszystko oprócz ..." z góry.


1 dla odpowiedzi № 12

Można pomiń grep lubię to:

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