Sao chép tất cả các tệp có một phần mở rộng nhất định từ tất cả các thư mục con


111

Dưới unix, tôi muốn sao chép tất cả các tệp có phần mở rộng nhất định (tất cả các tệp excel) từ tất cả các thư mục con sang một thư mục khác. Tôi có lệnh sau:

cp --parents `find -name \*.xls*` /target_directory/

Các vấn đề với lệnh này là:

  • Nó cũng sao chép cấu trúc thư mục và tôi chỉ muốn các tệp (vì vậy tất cả các tệp phải kết thúc bằng / target_directory /)

  • Nó không sao chép các tệp có khoảng trắng trong tên tệp (khá ít)

Bất kỳ giải pháp cho những vấn đề này?


Về find... exec mvthì sao?
fedorqui 'VẬY đừng làm hại nữa'

Câu trả lời:


173

--parents là sao chép cấu trúc thư mục, vì vậy bạn nên loại bỏ điều đó.

Theo cách bạn đã viết điều này, các findthực thi và đầu ra được đưa vào dòng lệnh sao cho cpkhông thể phân biệt giữa các khoảng trắng ngăn cách giữa tên tệp và khoảng trắng trong tên tệp. Tốt hơn là làm điều gì đó như

$ find . -name \*.xls -exec cp {} newDir \;

trong đó cpđược thực thi cho mỗi tên tệp findtìm thấy và chuyển đúng tên tệp. Đây là thông tin thêm về kỹ thuật này.

Thay vì tất cả những điều trên, bạn có thể sử dụng zsh và chỉ cần nhập

$ cp **/*.xls target_directory

zsh có thể mở rộng các ký tự đại diện để bao gồm các thư mục con và làm cho việc loại này trở nên rất dễ dàng.


2
Đúng. 'bin it' có nghĩa là vứt nó đi. Hiện đã được sửa đổi :-)
Brian Agnew

13
Bash4.0+ và ksh93cũng hỗ trợ **. Đối với bash, hãy sử dụng shopt -s globstarđể kích hoạt nó. Đối với ksh, đó là set -Ghoặc set -o globstar.
pynexj

2
@Daryl - Tôi đã điền thêm. Nhưng câu trả lời đã được đánh dấu là 'được chấp nhận', lưu ý
Brian Agnew

5
Exec Đó là về mặt kỹ thuật kém hiệu quả hơn thông qua vào xargs, mà sẽ làm tất cả trong càng ít cuộc gọi cp càng tốt: find . -name '*.xls' -print0 | xargs -0 cp -t destdir
Taywee

2
@BrianAgnew Ồ, tôi chắc chắn, rất vui khi có thêm thông tin trong phần nhận xét dành cho những người Google ngoan cố.
Taywee

37

Từ tất cả những điều trên, tôi đã nghĩ ra phiên bản này. Phiên bản này cũng hoạt động đối với tôi trong thiết bị đầu cuối khôi phục mac.

find ./ -name '*.xsl' -exec cp -prv '{}' '/path/to/targetDir/' ';'

Nó sẽ tìm trong thư mục hiện tại và đệ quy trong tất cả các thư mục con cho các tệp có phần mở rộng xsl. Nó sẽ sao chép tất cả chúng vào thư mục đích.

cờ cp là:

  • p - bảo tồn các thuộc tính của tệp
  • r - đệ quy
  • v - verbose (cho bạn biết cái gì đang được sao chép)

1
Điều này cũng giống như những gì tôi phải làm khi SSH vào Bluehost.
Plummer

4
Nó KHÔNG bảo tồn các thứ tự con.
b005t3r

3
@ b005t3r đó là theo thiết kế, nó không phải là như vậy. Đó là toàn bộ ý định của câu hỏi của OP. Ông muốn tất cả các file từ thư mục con sao chép vào một thư mục mà không subdirs
Madivad

2
Có cách nào để sửa đổi điều này để bảo toàn các thư mục con không?
Matthew Dean

8

Tôi đã có một vấn đề tương tự. Tôi đã giải quyết nó bằng cách sử dụng:

find dir_name '*.mp3' -exec cp -vuni '{}' "../dest_dir" ";"

Các '{}'";"thực hiện các bản sao trên mỗi file.


3

Tôi cũng đã phải tự mình làm điều này. Tôi đã làm điều đó thông qua đối số - parent cho cp:

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;

1
find [SOURCEPATH] -type f -name '[PATTERN]' | 
    while read P; do cp --parents "$P" [DEST]; done

bạn có thể xóa - cha mẹ nhưng có nguy cơ xung đột nếu nhiều tệp có cùng tên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.