Điểm:0

Tạo thư mục con và di chuyển tệp

lá cờ id

Tôi có một thư mục tên là p/ và trong p/ tôi có một vài thư mục con, như thế này:

$[~/p] ls
a/ b/ c/

a/ b/ và c/ mỗi cái cũng có nhiều thư mục con. Tôi đang cố gắng tìm một tệp khớp với một mẫu cụ thể vào từng thư mục và thư mục con của p/ và chuyển chúng sang một thư mục mới trong thư mục a/, b/ và c/ tương ứng của nó. Vì vậy, a/ sẽ có một thư mục con mới có tên là x/ và tất cả các tệp phù hợp được tìm thấy trong a/ sẽ được chuyển vào x/, b/ sẽ có một thư mục con mới có tên là x/ và tất cả các tệp phù hợp được tìm thấy sẽ được chuyển vào x/ trong b/, v.v.

Tôi đã thử:

pth=đường dẫn/đến/p

cho thư mục trong ${pth}/*; làm 
    mkdir -- "$dir/x";
    tìm thấy . -name '*match*' -exec mv -t ./x '{}' +;
xong

Tuy nhiên, nó không hoạt động, nó biến thư mục con x/ thành a/, b/ và c/ nhưng nó không di chuyển bất cứ thứ gì.

Tôi đã nhận:

mv: không thể truy cập vào './x': Không có tệp hoặc thư mục như vậy

Tôi đang làm gì sai ?? Bạn có thể vui lòng giúp tôi không?

muru avatar
lá cờ us
Bạn đã thực hiện `mkdir -- "$dir/x"`, nhưng sau đó bạn đã sử dụng `./x` trong lệnh `mv`.
bac0n avatar
lá cờ cn
Bạn không nên sử dụng mục tiêu trong điểm bắt đầu *find's*, nó có thể tạo ra điều kiện cuộc đua hoặc ít nhất là loại trừ mục tiêu.
Điểm:0
lá cờ cn

Tôi khuyên bạn nên thực hiện việc này theo từng giai đoạn bằng cách tạo các thư mục trước. Tiếp theo, tìm và sắp xếp kết quả tìm kiếm. Vì mục tiêu của bạn nằm trong cuộc tìm kiếm, bạn phải cắt bớt mục tiêu, nếu không nó có thể dẫn đến các điều kiện cuộc đua. Giờ đây, chúng tôi có thể xử lý từng mục một, nhưng vì mục này ngốn nhiều tài nguyên nên tốt hơn hết là tổ chức tìm kiếm của bạn trước khi di chuyển chúng dưới dạng mv chỉ lấy một mục tiêu, nó giới hạn số lượng tệp chúng tôi có thể di chuyển cùng một lúc. Trong trường hợp này, chúng ta có thể tổ chức tìm kiếm bằng một mảng kết hợp trong đó khóa trở thành mục tiêu. Tệp sẽ được gán dưới dạng một chuỗi. Điều quan trọng là trích dẫn bất kỳ ký tự đặc biệt nào trong tên tệp hoặc, ví dụ: khoảng trắng sẽ được hiểu là tách từ (hoặc ngắt theo cách khác).

#!/bin/bash

dựng sẵn cd p
printf %s/x\0 {a,b,c} | xargs -0 mkdir -p

khai báo -A a=()
trong khi IFS=/ read -rd '' b c; làm
    a[${b@Q}/x]+=\ "${b@Q}/${c@Q}"
xong < <(find -type d -path './*/x' -prune -false -o -type f -name '*.txt' -printf %P\0)

cho k trong "${!a[@]}"; làm
    eval printf '%s\0' "$k" "${a[$k]}" | xargs -0 mv --backup=t -t
xong
Al_Mt avatar
lá cờ id
Xin lỗi, tôi mới sử dụng thiết bị đầu cuối và tôi không hiểu rõ bạn đang làm gì, tôi đã thử chạy những gì bạn đề xuất và Nó tạo các thư mục a, b, c (nếu chúng không tồn tại) và thư mục con x bên trong mỗi, nhưng nó không di chuyển bất cứ điều gì. Ngoài ra, tôi không phải lúc nào cũng biết tên của a/, b/ và c/, và tôi có hàng trăm thư mục trong p/, vậy làm cách nào để thay đổi nó trong trường hợp đó?

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.