Odpowiedzi:
Komenda
mv !(new) new
powinien załatwić sprawę. Jeśli to nie działa, uruchom shopt -s extglob
najpierw.
Aby przenieść także ukryte pliki / katalogi (zaczynające się od kropki), uruchom także shopt -s dotglob
najpierw.
Więc by podsumować:
shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob
(zawsze lepiej jest rozbroić, dotglob
aby uniknąć złych niespodzianek).
!(something)
?
dev
do mojej bieżącej lokalizacji, czy muszę wykonać mv !(dev) dev
? Dostaję-bash: !: event not found
setopt extendedglob
ustawić rozszerzony tryb globalny w Zsh. ^
jest symbolem wykluczenia, więc mv ^new new
załatwi sprawę. następnie, aby zobaczyć wszystkie opcje ustawione w zsh, których możesz użyć setopt
i aby wyłączyć rozszerzony tryb globalny, możeszunsetopt extendedglob
Znalazłem coś takiego, ale jest nieco prostsze do zrozumienia i może również dobrze działać dla Ciebie:
ls | grep -v new | xargs mv -t new
Dodanie wyjaśnienia do powyższego rozwiązania:
Ze stron podręcznika:
mv -t
-t, --target-directory=DIRECTORY
move all SOURCE arguments into DIRECTORY
grep -v
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
Wyjaśnione krok po kroku:
ls
wyświetli listę plików w bieżącym katalogugrep -v new
zwróci potok do tego, że nie pasuje do nowegoxargs mv -t new
przeniesie pliki przesyłane do niego z grep -v
katalogu docelowegomv: illegal option -- t
. Czy to dlatego, że używam zsh
?
mv
(co oznacza, że twoja wersja mv różni się od tego, czego używałem), jakiego systemu używasz? Wierzę, że gdy pisałem tę odpowiedź byłem na linux distro centos
użyciu bash
.
mv: illegal option -- t
ponieważ mv osxa nie ma -t
opcji.
zsh
system operacyjny OSX , więc prawdopodobnie jest to system operacyjny…? Dzięki za wytłumaczenie!
Jeśli chcesz przenieść wszystkie pliki z folderu do jednego z jego podfolderów, możesz użyć następującego polecenia:
find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new
Znajduje wszystkie pliki, a następnie przenosi je do podfolderu.
@waltinator: dodano, -type d -name 'new' -prune
aby zapobiec przejściu /myuser/downloads/new
.
new
i wypróbowałem to polecenie, otrzymuję mv: missing file operand
iTry 'mv --help' for more information
Możesz wypróbować ten alternatywny proces –– pozostać na ścieżce
/myuser/downloads/
ale zamiast najpierw utworzyć /myuser/downloads/new/
katalog, zamiast tego utwórz folder w /myuser/
katalogu za pomocą polecenia mkdir ../new
, a następnie przenieś wszystkie pliki downloads
do new
i w końcu przejdź new
do downloads
. Możesz to zrobić w jednym wierszu na /myuser/downloads/
ścieżce za pomocą polecenia:
mkdir ../new && mv * ../new && mv ../new ../downloads
W takim przypadku nie musisz się martwić o jakiekolwiek „filtrowanie” plików / folderów, ponieważ new
jest na tym samym poziomie ścieżki, co downloads
, więc możesz po prostu przenieść wszystko downloads
do new
, a następnie przejść new
do pobierania.
Jeśli jednak masz już new
utworzony podfolder i nie chcesz tworzyć innego, nie martw się - po prostu zmień mkdir
polecenie po lewej stronie pierwszego &&
w powyższym mv
poleceniu na polecenie, przesuwając w new
górę ścieżka; innymi słowy, gdy jesteś jeszcze w środku /myuser/downloads/
, możesz zmienić mkdir ../new
na mv new ..
. Następnie podfolder new
[na ścieżce /myuser/downloads/new/
] zostaje wypchnięty do /myuser/new/
, na tym samym poziomie co /myuser/downloads/
, a następnie możesz uruchomić resztę polecenia, jak pokazano powyżej. Wszyscy razem zaczynamy od ścieżki /myuser/downloads/
:
mv new .. && mv * ../new && mv ../new ../downloads
a ponieważ chcesz „przenieść wszystkie pliki i foldery / podfoldery z folderu pobierania do podfolderu [ new
]”, gotowe! Jeśli chcesz przenieść tylko pliki (lub tylko foldery lub [wstaw bardziej szczegółowy ruch obiektu]), musisz użyć innych poleceń, które mogą „filtrować” obiekty, takie jak grep
. Powyższe polecenia są jednak wystarczające do twoich celów.
mv * new
, że będzie jęczeć „nie można przenieść nowego na nowy” lub coś podobnego. Być możemv -i * new
zapobiegniesz nadpisywaniu.