2010-12-29 4 views
6

У меня есть каталог с несколькими десятками файлов. Я хотел бы сделать что-то с каждым вторым файлом из этого каталога. К настоящему времени я использовал только find команду, но с этим я обработает все файлы:Как обрабатывать каждый второй файл в bash?

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

есть ли специальный шаблон названия для второй файл? – ajreal

+0

@ajreal: Я думал об этом. Все файлы похожи, но заканчивается на '_tX.XXXXXXX', где X - некоторые числа. Обычно они находятся в некотором диапазоне, например от 0,1 до 2,0, и они растут геометрически от наименьшего значения до самого большого. И нет определенного количества файлов. Поэтому я могу иметь 10 файлов в диапазоне от 0,1 до 2 или 100 файлов в одном диапазоне. Я не уверен, есть ли какой-то простой шаблон для соответствия каждому второму файлу. – klew

ответ

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 

или

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

Спасибо, это работает. В первом примере вам нужно добавить 'cnt = 0' внутри' if' - так будет каждый второй файл, а не только второй :) – klew

0

Если вы хотите запустить my_cmd на каждом из альтернативного файла, это может помочь

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

Я скопировал СЭД из 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 - номер текущей строки. Чтобы получить нечетные строки, используйте ... == 1.

+0

это, вероятно, самый чистый из представленных методов. Хорошая вещь. – SaltyNuts

0

У меня был каждый файл дважды, и вам нужно было удалить каждый второй файл. Найти только что вернул мне случайные файлы, поэтому я добавил сортировку. Она теперь выглядит следующим образом:

#!/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 

поместить это в файл с именем SCRIPTNAME запустите

chmod +x scriptName 

и запустить его по телефону

./scriptName