Odpowiedzi:
Usuń {}
z mv
, mv
weźmie to jako katalog docelowy, ignorując katalogi nadrzędne:
find -type f -exec mv {} collection/ \;
-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:
mv $PWD/* $DEST
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
shopt -s dotglob
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łóż
setopt extendedglob
w twoim .zshrc
. Następnie możesz użyć
mv $PWD/*(D) $DEST
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
:
mv $PWD/**/*(D.)
Wyrażenie to **/*
powoduje, że globber schodzi rekurencyjnie do podkatalogów. Te D
środki „również wybrać dotfiles; to .
znaczy«wybrać tylko zwykłe pliki, nie katalogów».
find -type f -exec mv -t collection/ {} +
. Sprawdź na stronie podręcznika, jak to działa.