Как выполнить команду для каждой строки файла?

Например, прямо сейчас я использую следующее, чтобы изменить пару файлов, чьи пути Unix я написал в файл:

cat file.txt | while read in; do chmod 755 "$in"; done 

Есть ли более элегантный, безопасный способ?

Если ваш файл не слишком большой, и все файлы имеют хорошо названный (без пробелов или других специальных символов, таких как кавычки), вы можете просто:

 chmod 755 $( 

Если у вас есть специальные символы и / или много строк в file.txt .

 xargs -0 chmod 755 < <(tr \\n \\0  

если ваша команда должна выполняться ровно 1 раз по записи:

 xargs -0 -n 1 chmod 755 < <(tr \\n \\0  

Это не нужно для этого примера, поскольку chmod принимает несколько файлов в качестве аргумента, но это соответствует названию вопроса.

В некоторых случаях вы можете определить местоположение аргумента файла в командах, генерируемых xargs :

 xargs -0 -I '{}' -n 1 myWrapper -arg1 -file='{}' wrapCmd < <(tr \\n \\0  

Да.

 while read in; do chmod 755 "$in"; done < file.txt 

Таким образом, вы можете избежать процесса cat .

cat почти всегда плоха для такой цели. Вы можете больше узнать о бесполезном использовании кошки.

Если вы знаете, что на входе нет пробелов:

 xargs chmod 755 < file.txt 

Если в путях могут быть пробелы, и если у вас есть GNU xargs:

 tr '\n' '\0' < file.txt | xargs -0 chmod 755 

если у вас есть хороший селектор (например, все .txt-файлы в каталоге), вы можете сделать:

 for i in *.txt; do chmod 755 "$i"; done 

bash for loop

или ваш вариант:

 while read line; do chmod 755 "$line"; done  

Если вы хотите запустить свою команду параллельно для каждой строки, вы можете использовать GNU Parallel

 parallel -a   

Каждая строка вашего файла будет передана программе в качестве аргумента. По умолчанию parallel выполняется столько streamов, сколько подсчитывает ваш процессор. Но вы можете указать его с -j

Я вижу, что вы отметили bash, но Perl также будет хорошим способом сделать это:

 perl -p -e '`chmod 755 $_`' file.txt 

Вы также можете применить регулярное выражение, чтобы убедиться, что вы получаете правильные файлы, например, только для обработки файлов .txt:

 perl -p -e 'if(/\.txt$/) `chmod 755 $_`' file.txt 

Чтобы «просмотреть», что происходит, просто замените обратные элементы двойными кавычками и print предварительной print :

 perl -p -e 'if(/\.txt$/) print "chmod 755 $_"' file.txt 

Вы также можете использовать AWK, который может дать вам больше гибкости для обработки файла

 awk '{ print "chmod 755 "$0"" | "/bin/sh"}' file.txt 

если в вашем файле есть разделитель полей, например:

field1, field2, field3

Чтобы получить только первое поле, которое вы делаете

 awk -F, '{ print "chmod 755 "$1"" | "/bin/sh"}' file.txt 

Вы можете проверить более подробную информацию о документации GNU https://www.gnu.org/software/gawk/manual/html_node/Very-Simple.html#Very-Simple

  • Эффективный способ сравнения строк версии в Java
  • Форматировать строку Go без печати?
  • искать текстовый файл с помощью c # и отображать номер строки и полную строку, содержащую ключевое слово поиска
  • Заполнение строк в C
  • Самый быстрый способ удалить все непечатаемые символы из строки Java
  • Java: String split (): Я хочу, чтобы он включал пустые строки в конце
  • Доступ к случайному элементу в списке
  • Снижение производительности String.intern ()
  • Эквивалент Sprintf в Java
  • Как удалить разрывы строк из файла в Java?
  • Что подразумевается под неизменным?
  • Давайте будем гением компьютера.