2013-01-15 12 views

Odpowiedz

23

Aby rekursywnie przenosić pliki, połącz find z mv.

find src/dir/ -name '*.txt' -exec mv {} target/dir/ \; 

Zmiana nazwy plików podczas ich przenoszenia jest trudniejsza. Jednym ze sposobów jest posiadanie pętli, która przechodzi każdą nazwę pliku przez tr/_, która przekształca ukośniki w podkreślenia.

find src/dir/ -name '*.txt' | while read file; do 
    mv "$file" "target/dir/$(tr/_ <<< "$file")" 
done 
+0

Wersja, która będzie działać z plikami zawierającymi wbudowane znaki nowej linii lub zaczynająca się spacjami: 'find src/dir -name '* .txt' -exec bash -c 'mv" $ 1 "" $ {1 // \// _} "'_ {}'; '' –

1

Jeśli to tylko jeden poziom:

mv *.txt */*.txt target/directory/somewhere/. 
11

Spróbuj tego:

find source -name '*.txt' | xargs -I files mv files target 

to będzie działać szybciej niż jakakolwiek opcja z -exec, ponieważ nie będzie wywoływał mv proces singe dla każdego pliku, który należy przenieść.

+0

Świetne rozwiązanie i bardzo szybko ... – Blacklight

+1

Znacznie, dużo szybciej niż zaakceptowana odpowiedź. Zauważ, że dla niezawodności dobrym pomysłem jest użycie łańcuchów nazw zakończonych zerem: 'find source -name '* .txt' -print0 | xargs -0 -I plików docelowych mv' – cooperised

Powiązane problemy