Odpowiedzi:
Komenda
mv !(new) new
powinien załatwić sprawę. Jeśli to nie działa, uruchom shopt -s extglobnajpierw.
Aby przenieść także ukryte pliki / katalogi (zaczynające się od kropki), uruchom także shopt -s dotglobnajpierw.
Więc by podsumować:
shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob
(zawsze lepiej jest rozbroić, dotglobaby uniknąć złych niespodzianek).
!(something)?
devdo mojej bieżącej lokalizacji, czy muszę wykonać mv !(dev) dev? Dostaję-bash: !: event not found
setopt extendedglobustawić rozszerzony tryb globalny w Zsh. ^jest symbolem wykluczenia, więc mv ^new newzałatwi sprawę. następnie, aby zobaczyć wszystkie opcje ustawione w zsh, których możesz użyć setopti 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 newprzeniesie pliki przesyłane do niego z grep -vkatalogu 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 centosużyciu bash.
mv: illegal option -- tponieważ mv osxa nie ma -topcji.
zshsystem 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' -pruneaby zapobiec przejściu /myuser/downloads/new.
newi wypróbowałem to polecenie, otrzymuję mv: missing file operandiTry '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 downloadsdo newi w końcu przejdź newdo 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ż newjest na tym samym poziomie ścieżki, co downloads, więc możesz po prostu przenieść wszystko downloadsdo new, a następnie przejść newdo pobierania.
Jeśli jednak masz już newutworzony podfolder i nie chcesz tworzyć innego, nie martw się - po prostu zmień mkdirpolecenie po lewej stronie pierwszego &&w powyższym mvpoleceniu na polecenie, przesuwając w newgórę ścieżka; innymi słowy, gdy jesteś jeszcze w środku /myuser/downloads/, możesz zmienić mkdir ../newna 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 * newzapobiegniesz nadpisywaniu.