2010-03-22 38 views

Trả lời

31
find -type f -maxdepth 1 -writable 
+0

Nó đưa ra cảnh báo về thứ tự các tùy chọn trên hệ thống của tôi. –

+0

bạn đang sử dụng Linux nào? – matja

+1

+1 cho maxdepth và loại f, tôi đã bao gồm những điều này trong câu trả lời của mình. –

3

-f sẽ kiểm tra cho một tập tin

-w sẽ kiểm tra xem nó có khả năng ghi

Ví dụ:

$ for f in *; do [ -f $f ] && [ -w $f ] && echo $f; done 
+2

-1 vô ích mà không cần ví dụ ... – lexu

+1

Cũng vô dụng mà không nói lệnh nào các tùy chọn này có nghĩa là được áp dụng cho. – bignose

+0

@ lexu/bignose - đó là câu hỏi 'bash'. '-f' và' -w' là các toán tử bash. Bạn cần thêm gì nữa à ? –

4

Nếu bạn đang ở trong vỏ sử dụng

find . -maxdepth 1 -type f -writable 

thấy người đàn ông tìm

Bạn sẽ tìm thấy câu trả lời tốt hơn cho loại câu hỏi này trên superuser.com hoặc serverfault.com

Nếu bạn đang viết mã không chỉ sử dụng trình bao, bạn có thể quan tâm đến (2) gọi hệ thống.

này question đã được hỏi về serverfault

EDIT: @ ghostdog74 hỏi nếu bạn loại bỏ quyền ghi cho tập tin này nếu điều này vẫn sẽ tìm thấy những tập tin. Câu trả lời, không có điều này chỉ tìm thấy các tập tin có thể ghi được.

[email protected] ~/temp 
$ cd temp 

[email protected] ~/temp/temp 
$ ls 

[email protected] ~/temp/temp 
$ touch newfile 

[email protected] ~/temp/temp 
$ ls -alph 
total 0 
drwxr-xr-x+ 2 dwaters Domain Users 0 Mar 22 13:27 ./ 
drwxrwxrwx+ 3 dwaters Domain Users 0 Mar 22 13:26 ../ 
-rw-r--r-- 1 dwaters Domain Users 0 Mar 22 13:27 newfile 

[email protected] ~/temp/temp 
$ find . -maxdepth 1 -type f -writable 
./newfile 

[email protected] ~/temp/temp 
$ chmod 000 newfile 

[email protected] ~/temp/temp 
$ ls -alph 
total 0 
drwxr-xr-x+ 2 dwaters Domain Users 0 Mar 22 13:27 ./ 
drwxrwxrwx+ 3 dwaters Domain Users 0 Mar 22 13:26 ../ 
---------- 1 dwaters Domain Users 0 Mar 22 13:27 newfile 

[email protected] ~/temp/temp 
$ find . -maxdepth 1 -type f -writable 

[email protected] ~/temp/temp 
+1

Tôi thấy lỗi sau với giải pháp của bạn: tìm: vị từ không hợp lệ '-writable ' – vehomzzz

+0

xin lỗi. ở vị trí sai, cố định ngay bây giờ, hãy xem người đàn ông tìm thấy cách sử dụng lệnh này –

+0

nếu bạn xóa tất cả quyền ghi vào một tệp và sau đó sử dụng lệnh, nó vẫn tìm thấy tệp? Tôi tò mò – ghostdog74

0
for var in `ls` 
do 
if [ -f $var -a -w $var ] 
then 
echo "$var having write permission"; 
else 
echo "$var not having write permission"; 
fi 
done 
+1

không sử dụng ls với vòng lặp để phân tích tên tệp. cũng trích dẫn các biến của bạn trong bài kiểm tra if/else. – ghostdog74

3

để tìm các file có thể ghi bất kể chủ sở hữu, nhóm hoặc người khác, bạn có thể kiểm tra w cờ trong cột phép tập tin của ls.

ls -l | awk '$1 ~ /^.*w.*/' 

$ 1 là trường đầu tiên, (tức là khối quyền của ls -l), cụm từ thông dụng chỉ tìm chữ "w" trong trường một. đó là tất cả.

nếu bạn muốn tìm chủ sở hữu quyền ghi

ls -l | awk '$1 ~ /^..w/' 

nếu bạn muốn tìm nhóm quyền ghi

ls -l | awk '$1 ~ /^.....w/' 

nếu bạn muốn tìm những người khác viết phép

ls -l | awk '$1 ~ /w.$/' 
+0

thật tuyệt vời! ypu có thể giải thích pelase lệnh awk này – vehomzzz

+0

dấu ngã có nghĩa là gì? – vehomzzz

+0

dấu ngã là toán tử regex của awk cho "trận đấu". giống như toán tử '= ~' regex của Perl – ghostdog74

16

Các Tùy chọn -writable sẽ tìm các tệp có thể ghi bởi người dùng hiện tại.Nếu bạn muốn tìm file mà vẫn được phép viết bởi bất cứ ai (hoặc thậm chí kết hợp khác), bạn có thể sử dụng tùy chọn -perm:

find -maxdepth 1 -type f -perm /222 

này sẽ tìm thấy file đó vẫn được phép của chủ sở hữu của họ (bất cứ ai có thể được) :

find -maxdepth 1 -type f -perm /200 

nhân vật khác nhau có thể được sử dụng để kiểm soát được ý nghĩa của các đối số chế độ:

  • / - bất kỳ sự cho phép chút
  • - - tất cả các bit (-222 có nghĩa là tất cả - người dùng, nhóm và khác)
  • no prefix - đặc điểm kỹ thuật chính xác (222 có nghĩa là không có permssions khác hơn là ghi)
+0

Đó là một giải pháp rất thanh lịch. Làm cách nào để sửa đổi điều này để tìm tệp chỉ có thể ghi bởi chủ sở hữu. – kshenoy

+3

@kshenoy: Một cách: '-perm -u + w! -perm -g + w! -perm -o + w' –

+0

Trên máy Mac hoặc bất kỳ phiên bản Linux cũ nào khác, sử dụng: find-type f + perm 222 – user1959190

0

Vấn đề với find -writable là rằng nó không di động và nó không dễ dàng để mô phỏng chính xác với các toán tử di động find. Nếu phiên bản của find không có nó, bạn có thể sử dụng touch để kiểm tra xem các tập tin có thể được ghi vào, sử dụng -r để chắc chắn rằng bạn (hầu như) không sửa đổi các tập tin:

find . -type f | while read f; do touch -r "$f" "$f" && echo "File $f is writable"; done

Các -r tùy chọn cho touch là trong POSIX, vì vậy nó có thể được coi là di động. Tất nhiên, điều này sẽ kém hiệu quả hơn nhiều so với find -writable.

Lưu ý rằng touch -rsẽ cập nhật mỗi tập tin ctime (thời gian của sự thay đổi cuối cùng để meta-data của nó), nhưng người ta ít khi quan tâm đến ctime anyway.

+0

Bạn đã thử 'chạm' trên một tệp chỉ đọc dưới dạng gốc hoặc trên tệp mà bạn sở hữu? Khả năng cập nhật dấu thời gian không ngụ ý rằng tệp có thể ghi được. –

+0

Nếu bạn là người chủ, các tệp chỉ đọc trên các hệ thống tệp có thể ghi được có thể ghi, vì vậy tôi không thấy sự cố ở đó. – Idelic

+0

Trên redhat 4 tôi nhận được "while: Expression Syntax." – jgritty

0

Nếu bạn muốn tìm tất cả các file được ghi bởi etal apache sau đó bạn có thể làm điều này:

sudo su www-data 
find . -writable 2>/dev/null 

Thay www-data với ai hoặc apache hoặc bất cứ người sử dụng web của bạn.

0

Tôi biết điều này là một chủ đề rất cũ, tuy nhiên ...

Lệnh dưới đây đã giúp tôi: find . -type f -perm /+w

Bạn có thể sử dụng -maxdepth dựa trên bao nhiêu mức dưới thư mục mà bạn muốn tìm kiếm. Tôi đang sử dụng Linux 2.6.18-371.4.1.el5.

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