2010-12-29 28 views
6

Tôi có một thư mục với vài chục tệp. Tôi muốn làm điều gì đó với mỗi tập tin thứ hai từ thư mục này. Bởi bây giờ tôi chỉ được sử dụng find lệnh nhưng với điều này tôi xử lý tất cả các file:Cách xử lý mọi tệp thứ hai trong bash?

find ./dir/ -type f -exec cat {} \; 
+0

có bất kỳ mô hình đặc biệt của tên cho tệp thứ hai? – ajreal

+0

@ajreal: Tôi đã nghĩ về điều này. Tất cả các tệp trông giống nhau, nhưng kết thúc bằng '_tX.XXXXXXX' trong đó X là một số. Thường thì chúng nằm trong một phạm vi nào đó, ví dụ từ 0,1 đến 2,0 và chúng phát triển hình học từ giá trị nhỏ nhất đến lớn nhất. Và không có số lượng tệp cụ thể. Vì vậy, tôi có thể có 10 tệp trong phạm vi từ 0,1 đến 2 hoặc 100 tệp trong cùng một phạm vi. Tôi không chắc chắn nếu có một số mô hình đơn giản để phù hợp với mọi tập tin thứ hai. – klew

Trả lời

6
cnt=0; 
for file in $(find ./dir -type f); <-- if not too many matches 
do 
    let cnt=cnt+1; 
    if [ $cnt -eq 2 ]; 
    then echo $file;    <-- do something 
    cnt=0;       <-- alternate file 
    fi; 
done 

hoặc

second_file=$(find -type f | head -2 | tail -1); 
+0

Cảm ơn, nó hoạt động. Trong ví dụ đầu tiên, bạn cần thêm 'cnt = 0' vào bên trong' if' - vì vậy nó sẽ là mọi tệp thứ hai, không chỉ thứ hai :) – klew

0

Nếu bạn muốn chạy my_cmd trên mỗi tập tin thay thế, điều này có thể giúp

find ./dir -type f | sort -n | sed -n '1~2!p' | sed 's/^/mycmd /' | sh 

Tôi đã sao chép sed từ How to remove every other line with sed?

14
for file in `find dir -type f | awk 'NR % 2 == 0'`; do 
    echo $file 
done 

NR là số hàng hiện tại. Để nhận các hàng lẻ, hãy sử dụng ... == 1.

+0

đây có lẽ là phương thức sạch nhất của các phương thức được trình bày. Đồ tốt. – SaltyNuts

0

Tôi đã có mọi tệp hai lần và cần xóa mọi tệp thứ hai. Tìm chỉ trả lại cho tôi các tệp ngẫu nhiên, do đó tôi đã thêm một loại. Nó bây giờ trông như thế này:

#!/bin/bash 
DIRNAME="<directoryNameContainingYourFiles>" 
for file in `find $DIRNAME -type f | sort | awk 'NR % 2 == 0'`; do 
    echo "going to modify" $file 
    # ls -laFh $file   # show file details 
    # rm $file     # delete file 
    # mv $file <newDirName> # move file to <newDirName> 
done 

đặt điều này trong một tập tin gọi Tập lệnh, chạy

chmod +x scriptName 

và bắt đầu nó bằng cách gọi

./scriptName 
Các vấn đề liên quan