スペースを含むファイルのリストをコピーするシェルスクリプト

スペースを含むファイルのリストをコピーするシェルスクリプト

ファイル名を使用してファイルの絶対位置を一覧表示し、別の場所にコピーする小さなスクリプトを作成しようとしています。

ファイルコンテンツのtest.txt例:

/home/public/Music/Disk/GameOfThrones/Season1/01 Main Title.mp3

試してみるスクリプト:

for file in `cat test.txt`; do cp "$file" temp ; done

しかし、スクリプトは3つのファイルがあると思います。その他の検索結果 以下の文書が出ました。

OIFS="$IFS"
IFS=$'\n'
for file in `cat test.txt`; do cp "$file" temp ; done
IFS="$OIFS"

これは、文字「n」のすべての発生を改行文字に置き換えるようです。

それでは、正しく行う方法は何ですか?

答え1

以下ではなく、whileループを使用してください。readfor

while read -r file ; do
    cp "$file" temp
done < test.txt

答え2

分割+グローブ演算子(`...`または新しい形式)は引用されません。$(...)

分割部分は、$IFSデフォルトでSPC、TAB、および改行文字に分割されます。ここでは、グローバル部分ではなく改行文字にのみ分割しようとします。だからこれは:

IFS='
' # split on newline only. IFS=$'\n' also works in some shells
set -o noglob # disable the glob part
cp -- $(cat test.txt) temp/

zsh明示的な分割演算子があるため、これは次のように単純化されます。

cp -- ${(f)"$(cat test.txt)"} temp/

GNUツールを使用すると、次のこともできます。

xargs -d '\n' -ra test.txt cp -t temp

(コピーするファイルの数が多い場合は、パラメータサイズの制限を解決するのにも役立ちます。)

関連情報