Необходимо прочитать список имен файлов из текстового файла с именем input.txt и принять меры для каждого имени файла.
Как мне прочитать имена файлов из текстового файла и выполнить команду /bin/foo для каждого файла?
Как мне прочитать имена файлов из текстового файла и выполнить определенные действия с этими файлами?
Введение – Часто вам нужно прочитать файл построчно и обработать данные.
Это довольно распространенная задача для скриптов оболочки для Linux и Unix.
Вам нужно использовать bash while loop и команду read.
Bash вывести имена файлов из текстового файла
Синтаксис следующий для чтения имен файлов из текстового файла:
while IFS= read -r file; do echo "Do something on $file ..." done < "filenames.txt" |
Или
input="data.txt" while IFS= read -r file; do printf '%s\n' "$file" done < "$input" |
Чтение имен файлов из текстового файла с помощью цикла bash
Давайте создадим новый файл с именем input.txt с именем файла в каждой строке, используя команду cat или vim:
cat > input.txt
Добавить данные:
foo.txt bar.txt delta.jpg nixcraft.logo.png sales.pdf /etc/resolv.conf /home/vivek/Documents/fy-19-2020.ods #/home/vivek/Documents/yearly-sales-data.ods
Вот пример скрипта оболочки bash для построчного чтения файла:
#!/bin/bash # Name - script.sh # Author - Vivek Gite under GPL v2.x+ # Usage - Read filenames from a text file and take action on $file # ---------------------------------------------------------------- set -e in="${1:-input.txt}" [ ! -f "$in" ] && { echo "$0 - File $in not found."; exit 1; } while IFS= read -r file do echo "Working on $file ..." done < "${in}" |
Просто запустите его следующим образом:
./script.sh
Также возможно игнорировать имена файлов, начинающиеся с #
Вот обновленная версия скрипта:
#!/bin/bash # Name - script.sh (bash read file names list from file) # Author - Vivek Gite under GPL v2.x+ # Usage - Read filenames from a text file and take action on $file # ---------------------------------------------------------------- set -e in="${1:-input.txt}" [ ! -f "$in" ] && { echo "$0 - File $in not found."; exit 1; } while IFS= read -r file do ## avoid commented filename ## [[ $file = \#* ]] && continue echo "Running rm $file ..." done < "${in}" |
Заключение
Вы узнали, как прочитать список имен файлов из файла в bash и принять меры по ним.