2012-12-16 8 views

Odpowiedz

37

Jeśli masz GNU mv (i find i xargs), można skorzystać z opcji -t do mv (i -print0 dla find i -0 dla xargs):

find . -type d -mtime -0 -print0 | xargs -0 mv -t /path/to/target-dir 

Należy pamiętać, że nowoczesne wersje find (kompatybilne z POSIX 2008) obsługują + w miejsce ; i zachowują się mniej więcej tak samo, jak xargs bez użycia xargs:

find . -type d -mtime -0 -exec mv -t /path/to/target-dir {} + 

To stwarza dogodne numery find grupowych pliku (katalogu) nazwisk w jednym wywołaniu programu. Nie masz poziomu kontroli liczby argumentów przekazywanych do mv, które zapewnia xargs, ale tak naprawdę rzadko potrzebujesz tego. To nadal zależy od opcji -t na GNU mv.

+0

To nie zadziała (masz odwrócone argumenty 'mv') – jlliagre

+0

@jlliagre: Czy sprawdziłeś znaczenie opcji' -t'? Po nim następuje nazwa katalogu docelowego, co oznacza, że ​​ostatni argument nie jest celem, co umożliwia dokładnie to użycie z 'xargs'. –

+1

Przepraszamy, masz rację. Błędnie odczytałem '-t' zamiast argumentu' xarg'. – jlliagre

0

Jeśli nie używasz GNU mv można użyć tego polecenia:

find . -depth -type d -mtime 0 -exec bash -c 'declare -a array;j=1;for i; do array[$j]="$i"; j=$((j+1));done; mv "${array[*]}" /path/to/target-dir' arg0 {} + 

inaczej, tutaj jest prostsze rozwiązanie, które nie wymaga xargs:

find . -depth -type d -mtime 0 -exec mv -t /path/to/target-dir {} + 

pamiętać, że dodatek - w przeciwnym razie wystąpią błędy, gdy przetwarzany będzie zarówno katalog, jak i jeden z jego podkatalogów.

1

find nie jest tak naprawdę dobrym narzędziem do tego. Wyobrażam sobie, że chcesz przenieść wszystkie podkatalogi do innego katalogu. find wyjściowe będzie takie rzeczy jak

./a 
./a/b 
./a/b/c 
./a/b/c/d 

Po ./a zostaje przeniesiony pierwszy, będziesz po prostu błędy o „Nie ma takiego pliku lub katalogu” wszystkich podkatalogów.

Powinieneś po prostu użyć mv */ /another/place - końcowy ukośnik na symbolu wieloznacznym ogranicza rozwinięcie tylko do katalogów.

35

Z BSD xargs (dla OS X i FreeBSD), można wykorzystać -J, który został zbudowany na to:

find . -name some_pattern -print0 | xargs -0 -J % mv % target_location 

To by przenieść niczego dopasowanie some_pattern w . do target_location

Z GNU xargs (dla Linux i Cygwin), należy użyć -I zamiast:

find . -name some_pattern -print0 | xargs -0 -I % mv % target_location 

przestarzałej -i opcja xargs GNU implikuje -I{} i mogą być wykorzystane w następujący sposób:

find . -name some_pattern -print0 | xargs -0 -i mv {} target_location 

Zauważ, że xargs BSD również opcję -I, ale że robi coś innego.

+0

W systemie Solaris użyłem: 'find. -name some_pattern | xargs -I% mv% target_location'. Dzięki –

3
find ./ -maxdepth 1 -name "some-dir" -type d -print0 | xargs -0r mv -t x/ 

znaleźć: z opcją -print0, wyjście kończy się '\ 0';

xargs: z opcją -0, będzie ona podzielona args przez '\ 0', ale spacją, -r oznacza nie-run-if-pusty, więc nie będzie żadnych błędów, jeśli find nie dostał żadnego wyjścia . (-r jest rozszerzeniem GNU.)

Zwykle używam tego w skryptach, gdy nie jestem pewien, czy istnieją pliki docelowe, czy nie.

Powiązane problemy