web-dev-qa-db-ja.com

Bashループを介してnullで区切られた文字列を読み取る

ファイル名に含まれる文字を気にせずにファイルのリストを反復処理したいので、ヌル文字で区切られたリストを使用します。コードは物事をよりよく説明します。

# 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
44
Matthew

Bashでは、ヒアストリングを使用できます

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

IFS=をインライン化して-d ''を使用する必要がありますが、「d」と最初の単一引用符の間にスペースがあることを確認してください。また、エスケープを無視するには、-rフラグを追加します。

また、これはあなたの質問の一部ではありませんが、findを使用するときにスクリプトを実行するより良い方法を提案するかもしれません。プロセス置換を使用します。

while IFS= read -r -d '' file; do
    # Arbitrary operations on "$file" here
done < <(find /some/path -type f -print0)
73
SiegeX

上記の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(),))
0
Henry Crutcher