Điểm:1

Tập lệnh Bash để sao chép tệp vào thư mục con được đặt theo tên của chủ sở hữu tệp

lá cờ cn

Tôi cần viết một tập lệnh bash để sao chép các tệp từ một thư mục sang các thư mục con được đặt tên theo các tệp. Ví dụ: có một thư mục chung "Dành cho tất cả", bên trong có nhiều tệp và thư mục khác nhau. Các tệp có tên với tên của chủ sở hữu cộng với một số ký hiệu khác như tom1, tom2, tom3,... hoặc scott1, scott2, scott3. Các thư mục con được đặt tên theo chủ sở hữu: tom và scott. Tôi cần viết một tập lệnh để sao chép tất cả các tệp trong thư mục "Dành cho tất cả" vào các thư mục con tương ứng của chúng. Đây là kịch bản của tôi.

#!/bin/bash
forall=/home/anastasia/Scripts
cd $forall
cho tệp trong $forall
 làm
        nếu [ -d $file ]
          sau đó
                tiếp tục
          fi
          nếu [ -e $file ]
          sau đó
                chủ sở hữu='ls -l $file | grep "^-" | awk {'in $£3'}'
                $file=$chủ sở hữu*   
                cp $file $forall/$owner
                chown $owner $forall/$owner/$file
        fi
xong

Có gì sai với kịch bản của tôi? Nó không làm bất cứ điều gì.

Điểm:1
lá cờ hr

Ngoài thực tế là

cho tệp trong $forall

sẽ thực hiện vòng lặp chỉ một lần, với tập tin $ đặt thành danh mục /home/anastasia/Tập lệnh, vấn đề cơ bản là

chủ sở hữu='ls -l $file | grep "^-" | awk {'in $£3'}'

gán chuỗi ký tự ls -l $file | grep "^-" | awk {in đến biến chủ nhân (và sau đó cố gắng thực hiện $£3} như một mệnh lệnh).

Có lẽ bạn dự định trích dẫn bên ngoài để thay thế lệnh đánh dấu ngược (và £3 trở nên đơn giản 3):

chủ sở hữu=`ls -l $file | grep "^-" | awk {'in $3'}`

tuy nhiên cách hiện đại sẽ sử dụng $(...) thay thế:

chủ sở hữu=$(ls -l $file | grep "^-" | awk {'print $3'})

Tuy nhiên, đó là một cách tồi tệ để tìm chủ sở hữu của tệp; thay vào đó tôi muốn giới thiệu

chủ sở hữu=$(stat -c %U -- "$file")

Ngoài ra, hãy nhớ trích dẫn các phần mở rộng biến của bạn, vì vậy đại loại như (chưa được kiểm tra):

#!/bin/bash

forall=/home/anastasia/Scripts

cho tệp trong "$forall"/*
làm
  nếu [ -d "$file" ]; sau đó
    tiếp tục
  fi
  nếu [ -e "$file" ]; sau đó
    chủ sở hữu=$(stat -c %U -- "$file")
    cp -n "$file" "$forall/$owner"/
    chown "$owner" "$forall/$owner/$file"
  fi
xong

Lưu ý rằng bạn sẽ có thể loại bỏ chown bằng cách thêm các tùy chọn thích hợp cho cp (có lẽ -P để duy trì chế độ, quyền sở hữu, dấu thời gian).

Kanarise avatar
lá cờ cn
Cảm ơn bạn rất nhiều vì những phản hồi có giá trị! Cách bạn đề xuất với cp -p và owner=$(stat -c %U --"$file") thực sự thanh lịch hơn. Tôi đã thực hiện những thay đổi cần thiết và nó đã hoạt động với một người dùng. Tôi sẽ xem xét thêm.

Đă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.