2012-12-16 45 views

Trả lời

37

Nếu bạn đã có GNU mv (và findxargs), bạn có thể sử dụng tùy chọn -t-mv (và -print0 cho find-0 cho xargs):

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

Lưu ý rằng hiện đại phiên bản của find (tương thích với POSIX 2008) hỗ trợ + thay cho ; và hoạt động gần giống như xargs mà không sử dụng xargs:

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

Điều này làm cho find nhóm số thuận tiện của tập tin (thư mục) tên vào một thỉnh nguyện duy nhất của chương trình. Bạn không có mức kiểm soát đối với số lượng đối số được chuyển đến mvxargs cung cấp, nhưng bạn hiếm khi thực sự cần đến điều đó. Điều này vẫn còn bản lề trên các tùy chọn -t để GNU mv.

+0

Điều này sẽ không hoạt động (bạn đã nhận được đối số 'mv' được đảo ngược) – jlliagre

+0

@jlliagre: Bạn đã tra cứu ý nghĩa của tùy chọn' -t' chưa? Nó được theo sau bởi tên thư mục đích, và có nghĩa là đối số cuối cùng không phải là đích sau khi tất cả, do đó cho phép chính xác việc sử dụng này với 'xargs'. –

+1

Xin lỗi, bạn đã đúng. Tôi đã hiểu sai '-t' để trở thành đối số' xarg' thay thế. – jlliagre

0

Nếu bạn không sử dụng GNU mv, bạn có thể sử dụng lệnh rằng:

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 {} + 

cách khác, đây là một giải pháp đơn giản mà không đòi hỏi xargs:

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

Lưu ý rằng tôi đã thêm -depth nếu không, bạn sẽ có lỗi khi cả thư mục và một thư mục con của nó sẽ được xử lý.

1

find không thực sự là công cụ tốt cho việc này. Tôi tưởng tượng bạn muốn di chuyển tất cả các thư mục con vào một thư mục khác. find chí ra những thứ như

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

Sau ./a được di chuyển đầu tiên, bạn sẽ chỉ nhận lỗi về 'không có tập tin hoặc thư mục' tất cả các subdirs.

Bạn chỉ nên sử dụng mv */ /another/place - dấu gạch chéo sau trên ký tự đại diện hạn chế việc mở rộng thành chỉ các thư mục.

35

Với BSD xargs (ví OS X và FreeBSD), bạn có thể sử dụng -J được xây dựng cho việc này:

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

Điều đó sẽ di chuyển bất cứ điều gì phù hợp với some_pattern trong .-target_location

Với GNU xargs (cho Linux và Cygwin), hãy sử dụng -I thay vào đó:

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

Các phản -i tùy chọn của xargs GNU ngụ ý -I{} và có thể được sử dụng như sau:

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

Lưu ý rằng BSD xargs cũng có một tùy chọn -I, nhưng điều đó làm điều gì đó khác.

+0

Trên Solaris tôi đã sử dụng: 'find. -name some_pattern | xargs -I% mv% target_location'. Cảm ơn –

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

tìm: với tùy chọn -print0, sản lượng sẽ kết thúc với '\ 0';

xargs: với tùy chọn -0, nó sẽ chia args bởi '\ 0' nhưng khoảng trắng, -r nghĩa là không-run-nếu có sản phẩm nào, vì vậy bạn sẽ không nhận được bất kỳ lỗi nào nếu find đã không nhận được bất kỳ đầu ra . (Các -r là một phần mở rộng GNU.)

Tôi thường sử dụng điều này trong các kịch bản khi tôi không chắc chắn nếu các tập tin mục tiêu tồn tại hay không.

Các vấn đề liên quan