Как обработать каждый второй файл в bash?

у меня есть каталог с несколькими десятками файлов. Я хотел бы сделать что-то с каждым вторым файлом из этого каталога. Теперь я только использовал но с этим я обработал все файлы:

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

4 ответов


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);

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

NR - номер текущей строки. Чтобы получить нечетные строки, используйте ... == 1.


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

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

Я скопировал sed из Как удалить каждую другую строку с помощью sed?


у меня был каждый файл дважды, и мне нужно было удалить каждый второй файл. Find только что вернул мне случайные файлы, поэтому я добавил сортировку. Теперь это выглядит так:

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