Próbuję zebrać wszystkie pliki w bieżącym katalogu i wszystkie podkatalogi w jednym katalogu. Próbuję czegoś takiego
find -type f -exec mv {} collection/{} \;
powyższe polecenie nie zadziała, ponieważ drugie {}
daje pełną ścieżkę, jak mogę zebrać wszystkie pliki?
command-line
find
Królik
źródło
źródło
-maxdepth 1
pomogłoby.find -type f -print0|xargs -0r mv -it colection/
Zamiast używać
find
(co dobrze wykonuje zadanie), możesz również użyć powłoki w tym celu.Powiedz, że chcesz mieć wszystkie pliki od $ PWD do $ DEST. Naturalną próbą byłoby:
Jak to działa? Wyrażenie „$ PWD / *” rozwija się do nazw wszystkich plików w tym katalogu. Ta funkcja powłoki nazywa się „globowaniem”. Ostatnim argumentem
mv
jest katalog docelowy. Jeśli masz bardzo wiele plików, to nie zadziała, ponieważ długość wiersza polecenia jest ograniczona.Ale rozwiązanie ma problem polegający na tym, że pomija pliki kropkowe - lub „ukryte” pliki, pliki i katalogi, których nazwa zaczyna się od „.”. Aby rozwiązać ten problem, musisz powiedzieć swojej powłoce, aby dołączała pliki kropkowe podczas globowania. Aby to zrobić, użyj
podczas korzystania
bash
(i prawdopodobnie używasz,bash
chyba że zmieniłeś ustawienie domyślne). W tej powłoce powyższe polecenie będzie również działać dla plików dot.Nawiasem mówiąc, w
zsh
, masz możliwość wyboru tego na podstawie indywidualnych przypadków. Aby to zrobić, włóżw twoim
.zshrc
. Następnie możesz użyćaby przenieść wszystkie pliki, w tym pliki kropkowe. („D” powoduje tymczasowe włączenie opcji „GLOB_DOTS”).
Pierwotnym pytaniem było przeniesienie wszystkich zwykłych plików (nie katalogów) ze wszystkich podkatalogów i ich podkatalogów do jednego katalogu. Można to osiągnąć za pomocą
zsh
:Wyrażenie to
**/*
powoduje, że globber schodzi rekurencyjnie do podkatalogów. TeD
środki „również wybrać dotfiles; to.
znaczy«wybrać tylko zwykłe pliki, nie katalogów».źródło
find -type f -exec mv -t collection/ {} +
. Sprawdź na stronie podręcznika, jak to działa.