Mam katalog, który próbuję wyczyścić, zawierający zarówno pliki, jak i podkatalogi. To, co próbuję zrobić, jest proste: przenieś wszystkie pliki do innego katalogu, ale pozostaw wszystkie podkatalogi bez zmian.
Mam na myśli coś takiego:
mv [*_but_no_dirs] ./other_directory
Wydaje się, że powinien istnieć prosty sposób na zrobienie tego za pomocą symboli wieloznacznych *
i wyrażeń regularnych ...
Czy ktoś ma pomysły?
mv **/*(.) ./other_directory
- za pomocą bash musisz jednak uciekać się do zewnętrznych poleceń, takich jakfind
.Odpowiedzi:
Regex nie jest tutaj zaangażowany. Symbole wieloznaczne w bash (podobnie jak większość innych powłok) pasują tylko do plików na podstawie nazw plików, a nie na podstawie typu pliku lub innych cech. Istnieje jeden sposób dopasowania według typu: dodanie
/
na końcu wzorca powoduje, że dopasowuje tylko katalogi lub dowiązania symboliczne do katalogów. W ten sposób możesz przenosić katalogi, a następnie przesuwać to, co zostało, i przenosić katalogi z powrotem - kłopotliwe, ale działa.Standardowym sposobem dopasowania plików według typu jest wywołanie
find
.W zsh możesz używać kwalifikatorów glob, aby dopasowywać pliki według typu.
.
Kwalifikator mecze zwykłe pliki; służy^/
do dopasowania wszystkich katalogów niebędących katalogami lub-^/
do dołączenia symbolicznych łączy do katalogów.W dowolnej powłoce możesz po prostu zapętlić.
źródło
Możesz użyć czegoś takiego
Najpierw używamy
find
do wyszukiwania tylko w bieżącym directoy, następnie ignorujemy katalogi, używając w! -type d
końcu wykonujemysh
i przenosimy wszystko do katalogu docelowego. Możesz spróbować{} +
na końcu, który będzie szybszy.źródło
-exec sh -c 'mv "$@" MYDIR' _ {} \;
raczej sugerujesz niż-exec mv {} MYDIR \;
? Wystarczy, aby uzyskać coś, co może być usprawnione poprzez zmianę\;
Do+
? Możesz to zrobić za pomocą-exec mv -t MYDIR {} +
formularza.-t
fladze. Wyjaśniłem również w odpowiedzi, że+
jest szybszy, ale nie wszystkiefind
wersje go obsługują. Tak więc powyższy kod jest w zasadzie kompatybilny z dowolnymfind
lub używaną powłoką.find
używaną powłoką.” To prawda, ale tak jestfind … -exec mv {} MYDIR \;
i zużywa mniej zasobów niż… -exec sh -c 'mv "$@" MYDIR' _ {} \;
.Jest to potencjalnie trochę niebezpieczne, ale
Ponieważ zarówno cp, jak i rm nie będą działać na katalogach bez przełącznika -r.
źródło
Sugerowałbym po prostu zrobić
mv *.* destination/
z miejscem docelowym / folderem, do którego się przeprowadzasz.źródło
*.*
przenoszą niektóre katalogi i pozostawiają niektóre pliki, czego nie chciał pytający.źródło