Jak przenieść wszystkie pliki z bieżącego folderu do podfolderu?

69

Jestem na ścieżce:

/myuser/downloads/

I tworzę podfolder:

/myuser/downloads/new

Teraz chcę przenieść wszystkie pliki i foldery / podfoldery z folderu pobierania do podfolderu.

jak mogę to zrobić?

Próbowałem:

mv -R *.* new/

Ale wydaje się, że ruch nie wymaga przełącznika -R.

Blankman
źródło
4
Nie potrzebujesz -R. Tylko mv * new, że będzie jęczeć „nie można przenieść nowego na nowy” lub coś podobnego. Być może mv -i * newzapobiegniesz nadpisywaniu.

Odpowiedzi:

100

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).

enzotib
źródło
5
czy możesz wymienić jakie jest znaczenie !(something)?
Adeerlike
2
@ wnuczka, która mówi po prostu nie (coś). Innymi słowy, skopiuj wszystko, ale nie coś. Czyste jak błoto?
RockyMountainHigh
4
bardzo. czy znasz ekwiwalent dla zsh?
Adeerlike
1
Nie rozumiem, np. Co Jeśli spróbuję przenieść zawartość folderu devdo mojej bieżącej lokalizacji, czy muszę wykonać mv !(dev) dev? Dostaję-bash: !: event not found
Czarny
5
@adeer bardzo podobny. 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
Mr. T
10

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 katalogu
  • grep -v new zwróci potok do tego, że nie pasuje do nowego
  • xargs mv -t newprzeniesie pliki przesyłane do niego z grep -vkatalogu docelowego
lockwobr
źródło
Próbowałem tej metody, ale otrzymuję: mv: illegal option -- t. Czy to dlatego, że używam zsh?
ConstantFun
@ ConstantFun To może być Zsh, ale zgaduję, że to twoja implementacja 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.
lockwobr
2
Właśnie testuję to na osxie i otrzymuję ten sam błąd, mv: illegal option -- tponieważ mv osxa nie ma -topcji.
lockwobr
1
(Nie próbowałem tego i nie planuję tego.) Ten link apple.stackexchange.com/questions/69223/… mówi ci, jak zainstalować gnucore, który powinien pomóc ci zdobyć gnu core cli utils, osx jest dostarczany z bsd narzędzia cli, które różnią się od tych, które są dostarczane z Linuksem.
lockwobr
Mam zshsystem operacyjny OSX , więc prawdopodobnie jest to system operacyjny…? Dzięki za wytłumaczenie!
ConstantFun
7

Prosty pomysł. Zakładając, że jesteś w / myuser , zmień nazwę pobrań na nowy , utwórz nowy katalog pobrań, a następnie przenieś do niego nowy .

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.
jpezz
źródło
1

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.

demian
źródło
Utworzyłem podkatalog o nazwie newi wypróbowałem to polecenie, otrzymuję mv: missing file operandiTry 'mv --help' for more information
mook765
1

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.

adamcatto
źródło