Как обработать каждый второй файл в 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