Jak mogę przenosić pliki według typu rekurencyjnie z katalogu i jego podkatalogów do innego katalogu?

30

Jaki byłby dobry sposób na przeniesienie typu pliku z katalogu i wszystkich jego podkatalogów?

Jak „przenieś wszystko * .ogg do / thisdir rekurencyjnie do / somedir”. Próbowałem kilku rzeczy; moim najlepszym wysiłkiem było (wciąż niezbyt wielkie):

find /thisdir -type f -name '*.ogg' -exec mv /somedir {} \;

Wracał w każdym wierszu przed każdą nazwą pliku,

mv: cannot overwrite non-directory `/thisdir/*.ogg' with directory `/somedir'
Steve Burdine
źródło

Odpowiedzi:

23

można użyć znalezienia z xargs do tego

find /thisdir -type f -name "*.ogg" -print0 | xargs -0 -Imysongs mv -i mysongs /somedir

-I w powyższym poleceniu mówi xargsowi, jakiego ciągu zastępczego chcesz użyć (w przeciwnym razie dodaje argumenty na końcu polecenia).

LUB
W swoim poleceniu po prostu spróbuj przenieść „{}” po mvpoleceniu.

find /thisdir -type f -name '*.ogg' -exec mv -i {} /somedir \;

Hemant
źródło
1
nie zapomnij zrobić kopii zapasowej przed wypróbowaniem powyższych poleceń :-).
Hemant
2
Btw, dla pierwszego -print0 dla find i -0 dla xargs powinno być używane jak to możliwe, aby uniknąć białych znaków w problemach z nazwami plików.
maxschlepzig
@maxschlepzig: dobry punkt. Będę edytować.
Hemant
2
Zdecydowanie sugeruję użycie mv -itutaj, abyś nie ryzykował nadpisywania plików, jeśli wydarzy się coś nieoczekiwanego.
Gilles „SO- przestań być zły”
2
z mv z podstawowych narzędzi GNU możesz użyć mv -t <targetdir>+ i zamiast \;
10
find /thisdir -type f -name "*.ogg" -exec mv {} /somedir \;

W pewnym sensie wymieniłeś argumenty na mv

Coding District
źródło
9

W Zsh lub Bash 4, aby zebrać wszystkie *.oggpliki w /somedir:

mv /thisdir/**/*.ogg /somedir

Jeśli chcesz odtworzyć hierarchię katalogów: (ostrzeżenie wpisane bezpośrednio w przeglądarce)

rsync -a --prune-empty-dirs --include='*/' --include='*.ogg' --exclude='*' /thisdir /somedir
Gilles „SO- przestań być zły”
źródło
poza dogodnym w bash
Mark