ファイル名を使用してファイルの絶対位置を一覧表示し、別の場所にコピーする小さなスクリプトを作成しようとしています。
ファイルコンテンツの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
ループを使用してください。read
for
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
(コピーするファイルの数が多い場合は、パラメータサイズの制限を解決するのにも役立ちます。)