Bash: прочитать имена файлов из текстового файла и принять к ним действия

by itisgood

Необходимо прочитать список имен файлов из текстового файла с именем 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 и принять меры по ним.

 

You may also like

Leave a Comment