Как обработать каждый второй файл в bash? - PullRequest
6 голосов
/ 29 декабря 2010

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

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

Ответы [ 4 ]

15 голосов
/ 29 декабря 2010
for file in `find dir -type f | awk 'NR % 2 == 0'`; do
  echo $file
done

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

6 голосов
/ 29 декабря 2010
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 голосов
/ 10 декабря 2015

У меня был каждый файл дважды, и мне нужно было удалить каждый второй файл. 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
0 голосов
/ 29 декабря 2010

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

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

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

...