Чтение строк с нулевым разделением через цикл Bash - PullRequest
38 голосов
/ 30 декабря 2011

Я хочу перебрать список файлов, не заботясь о том, какие символы могут содержать имена файлов, поэтому я использую список, разделенный нулевыми символами. Код объяснит лучше.

# Set IFS to the null character to hopefully change the for..in
# delimiter from the space character (sadly does not appear to work).
IFS=$'\0'

# Get null delimited list of files
filelist="`find /some/path -type f -print0`"

# Iterate through list of files
for file in $filelist ; do
    # Arbitrary operations on $file here
done

Следующий код работает при чтении из файла, но мне нужно прочитать из переменной, содержащей текст.

while read -d $'\0' line ; do
    # Code here
done < /path/to/inputfile

Ответы [ 2 ]

64 голосов
/ 30 декабря 2011

В bash вы можете использовать здесь-строку

while IFS= read -r -d '' line ; do
    # Code here
done <<<"$var"

Обратите внимание, что вы должны вставить IFS= и просто использовать -d '', но убедитесь, что между 'd' ипервая одинарная кавычкаКроме того, добавьте флаг -r, чтобы игнорировать escape-символы.

Кроме того, это не является частью вашего вопроса, но я мог бы предложить лучший способ сделать ваш скрипт при использовании find;он использует подстановку процесса.

while IFS= read -r -d '' file; do
    # Arbitrary operations on "$file" here
done < <(find /some/path -type f -print0)
0 голосов
/ 13 апреля 2018

Я попытался поработать с примерами bash, приведенными выше, и, наконец, сдался и использовал Python, который работал впервые.Для меня оказалось, что проблема была проще вне оболочки.Я знаю, что это возможно не по теме решения bash, но я все равно выкладываю его здесь на случай, если другие захотят альтернативы.

import sh
import path
files = path.Path(".").files()
for x in files:
    sh.cp("--reflink=always", x, "UUU00::%s"%(x.basename(),))
    sh.cp("--reflink=always", x, "UUU01::%s"%(x.basename(),))
...