Jeśli chcesz przenieść wszystko oprócz katalogów z $SOURCE_DIR
do $TARGET_DIR
, możesz użyć tego polecenia:
find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +
Szczegółowo wyjaśnione:
find
: Znajdź wyszukiwanie plików w katalogu
$SOURCE_DIR
: Katalog do przeszukania
-maxdepth 1
: Nie zaglądaj do podkatalogów
-not -type d
: Ignoruj katalogi
- Możesz także użyć,
-type f
jeśli chcesz kopiować tylko pliki, które są ściśle plikami, ale wolę powyższe, ponieważ przechwytuje wszystko, co nie jest ani plikiem, ani katalogiem (w szczególności dowiązaniami symbolicznymi)
-exec mv -t "$TARGET_DIR" -- '{}' +
: Uruchom polecenie, w mv -t "$TARGET_DIR" -- FILES...
którym FILES...
znajdują się wszystkie pasujące pliki (dzięki @DavidFoerster)
find ... -exec mv -t "$TARGET_DIR" -- '{}' +
byłoby bezpieczniejsze (w przypadku$TARGET_DIR
braku katalogu lub dopasowania zaczyna się od-
) i bardziej wydajne (ponieważ nie spawnuje nowego podprocesu dla każdego dopasowanego pliku).Myślę, że chcesz mv tylko swoje pliki. Najpierw przejdź do katalogu i użyj tego polecenia, zamień $ TARGET na ścieżkę katalogu docelowego. Jeśli chcesz skopiować pliki, zastąp
mv
jecp
.jeśli to wyjaśnię,
find . -type f
oznacza wybranie wszystkich plików i-exec mv {} $TARGET \;
wykonaniemv
polecenia dla wszystkich wybranych pozycji.Poprzednia odpowiedź zawiera błąd. Dotyczy to również
mv
wszystkich plików w podkatalogach. Szybka poprawka jest używana-maxdepth 1
. Wtedy nie rekurencyjnie zapisujemv
pliki w podkatalogach. Poniżej jest poprawny ..źródło
-type f
Nie przeszkadza rekursji.Podejście do Pythona
Jeśli chodzi o pliki rekurencyjne,
find
jest to najlepsza droga. W tym konkretnym przypadku nie jest to konieczne, ale można go używać z-maxdepth 1
innymi odpowiedziami.Proste polecenie Pythona może to również zrobić. Oto przykład:
Jak to działa:
fl=[f for f in os.listdir('.') if os.path.isfile(f)]
iteruje wszystkieos.listdir('.')
znalezione elementy, a my sprawdzamy, czy dany plik jest plikiem przy użyciuos.path.isfile()
funkcji.Po
fl
utworzeniu listy plików korzystamy zmap()
funkcji. Ta funkcja przyjmuje dwa argumenty - funkcję i listę elementów; wykona funkcję, którą mu nadaliśmy dla każdego pliku na liście. Mamy więc tutajlambda x:shutil.move(x,'./a_directory')
anonimową funkcję, która przeniesie dany plik do danego katalogu, a następnie mamyfl
- listę plików, które zbudowaliśmy.Aby zapewnić czytelność i ogólne użycie, możemy również przepisać to jako ogólny skrypt Pythona, który przyjmuje dwa argumenty - katalog źródłowy i docelowy podkatalog.
A użycie jest takie:
źródło
Jeśli używasz zsh zamiast bash, możesz to zrobić:
Na
(.)
końcu nazywa się globalny kwalifikator;.
wewnątrz oznacza konkretnie tylko dopasować zwykłe pliki.Robienie
mv *(.) "$target"
jest szybkie i praktyczne. Jeśli jednak robisz to jako część skryptu, możesz zamiast tego rozważyć napisanie czegoś takiego, jak sugerowali Frxstrem i David Forestermv -t "$target" -- *(.)
, aby lepiej obsługiwać przypadki narożne, które mogą powstać w przypadku korzystania z innych osób.źródło
mv -t "$TARGET" -- "$SOURCE"/*(.)
byłoby bezpieczniej (w przypadku gdy"$TARGET"
zaczyna się-
od katalogu lub nie jest katalogiem). Podoba mi się jednak rozwiązanie zsh!Aby przenieść wszystko oprócz katalogów z
source-dir
katalogu dodestination-dir
katalogu, w Pythonie:Zobacz Uruchamianie pliku Python w terminalu .
źródło
import mypackage
przedfrom mypackage import ...
from __future__
importu i zwykłegofrom pathlib
importu.import module
powinien być pierwszy (który dotyczy biblioteki i importu stron trzecich)from module import object
powinien być ostatni (specyficzny dla lokalnej / biblioteki)Skorzystałbym
będzie to działać, dopóki twoje foldery nie będą miały rozszerzeń.
źródło