Czy przenieść wszystkie pliki z podkatalogów do bieżącego katalogu?

14

Jak mogę przenieść pliki zawarte we wszystkich podkatalogach do bieżącego katalogu, a następnie usunąć puste podkatalogi?

Znalazłem to pytanie , ale dostosowując odpowiedź do:

mv * .

nie działał; Otrzymałem wiele ostrzeżeń wyglądających jak:

mv: wil and ./wil are identical

Pliki zawarte w podkatalogach mają unikalne nazwy.

Richard
źródło

Odpowiedzi:

23

Możesz również użyć -mindepthopcji:

find . -type f -mindepth 2 -exec mv -i -- {} . \;

(Razem z -maxdepthTobą możesz również ograniczyć poziomy hierarchii, z których należy zbierać pliki).

Użyłem mv -i(„interaktywnego”), aby mvzadać pytanie przed zastąpieniem plików. W przypadku wielu podkatalogów mogą wystąpić konflikty nazw, o których chciałbyś być ostrzegany.

--Opcja zatrzymuje przetwarzanie opcji, więc mvnie zostanie zmieszany nazwach rozpoczynających się od łącznika.

Oczyść całą masę pustych podkatalogów za pomocą

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
Florian Jenn
źródło
Czy istnieje również sposób na pominięcie pytania o zastąpienie plików, nie zastępując ich?
Filnor,
2
Opcje dla mv:: -n, --no-clobbernie zastępuj istniejącego pliku. Ty też możesz być zainteresowany -b, --backup.
Florian Jenn,
5

Spróbuj tego:

find ./*/* -type f -print0 | xargs -0 -J % mv % .

Więcej informacji: Wypróbuj sam find-stamement, powinien dać ci listę ze wszystkimi plikami, które chcesz przenieść (pomiń -print0). Przykład:

probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7

za pomocą -print0i xargstworzysz teraz listę instrukcji do wykonania. Te -J %środki flag, wstaw element listy tutaj, więc mv $FILE .jest wykonywany dla każdego pliku znaleziony.

Powyższe działa dla Xargs BSD. Jeśli używasz wersji GNU (Linux), weź -I %zamiast-J %

trurl
źródło
0

Bash 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done
ata
źródło
0
mv */* .

Przeniesie wszystkie pliki ze wszystkich podkatalogów do bieżącego katalogu.

Jeśli potrzebujesz czyszczenia, możesz użyć

find . -type d -empty -delete

Usunie wszystkie puste podkatalogi.

Nikandr Marhal
źródło
-2

1 szybka sztuczka, działa tylko, jeśli twoje pliki mają rozszerzenia (z kropką):

mv *.* subdir/
mv .* subdir/
Guillermo
źródło
-2

Po prostu uruchom to polecenie :-)

mv **/*.* .

Paul Digi
źródło
1
To nie znajdzie plików, które nie mają .w nazwie, prawda?
G-Man mówi „Przywróć Monikę”