2016-06-14 2 views
0

У меня есть код BASH, где код принимает файл CSV в качестве аргумента, то есть:Как индивидуально открывать файлы в данном каталоге?

:~$ ./mycode.sh mycsv.csv 

где mycsv.csv получает обрабатываются mycode.sh. В каталоге много CSV-файлов, и все они нуждаются в индивидуальной обработке. Как я могу сделать код через каждый из файлов CSV?

+2

улучшить свой скрипт для обработки несколько входных файлов. –

ответ

5

Используйте for конструкцию для петли над .csv файлы и передавать по одному сценарию:

for file in *.csv; do ./mycode.sh "$file"; done 
1

Вы также можете использовать find команду для этого: -

find . -name "*.csv" -type f -printf '%f\n' -exec ./mycode.sh {} \; 
  • найти файлы с расширением .csv без ведущего ./
  • R ип скрипт mycode.sh для всех файлов возвращается из текущей папки

Обновление: -

Для обработки файлов-имена, которые содержат символы новой строки или другие типы пробелов или других специальных символов, я принятии -print0 от find и считывая их с помощью ограничителя ''. Кроме того, используя bash параметр-расширение, чтобы лишить ведущие символы ./ из команды находит

#!/bin/bash 

find . -name "*.csv" -type f -print0 | 
    while IFS= read -r -d '' x; do 
     ./mycode.sh "${x:2}" 
    done 
+1

Обратите внимание, что '-printf' не является стандартным. Поскольку вы хотите распечатать только имя файла, вместо этого используйте '-print' (он также напечатает ведущие каталоги, но, по крайней мере, он переносится). –

+0

@gniourf_gniourf: Спасибо за предложение, ознакомьтесь с моим обновленным ответом! – Inian

+2

Ну, '-print0' также нестандартен. Обратите внимание, что ваш оригинальный ответ обрабатывает все типы смешных символов в именах файлов правильно (пробелы, символы новой строки, глобы и т. Д.), Без необходимости цикла while (и нестандартного '-print0'). Для достижения такой же переносимости: 'find. -name '* .csv' -type f -exec sh -c 'printf% s \\ n "$ 0"; ./mycode.sh "$ {0 #. /}" '{} \; 'или любые варианты темы. –

Смежные вопросы