次のテキストファイルがあります。
Order,Site_ID
[email protected],AR-Slu
「注文」列には、「Site_ID」列(テキストファイルの同じ行)に表示されている対応するフォルダに移動するフォルダの名前が含まれています。以下は、1つのフォルダだけを移動する例です。この例では、フォルダを移動したいと思います。[Eメール保護]'を 'AR-Slu'フォルダにコピーします。テーブルに含まれる情報はフォルダ名ですが、フォルダのパス情報はありません。ただし、両方のフォルダーは同じ親フォルダーにあります。これを行う方法を知っている人はいますか?
ベストアンサー1
スペースで区切られた値の場合
(質問の元のバージョンと同じ)
(cd /parent/folder && tail -n +2 | xargs -L 1 mv --) < file
tail
タイトルをスキップすることです。
を使用すると、-L 1
入力1行ごとにxargs
1つのコマンドが実行されます。mv
性格この行はにパラメータとして渡されますmv
。
のためにxargs
、性格すべてはスペースで区切られますが(すべてのスペースまたはスペースとタブのみの実装によって異なりますxargs
)、これらのスペースまたは互いをエスケープするために使用できる引用演算子としてxargs
も認識されます"
。'
\
while read
シェルループを使用することもできます。
(
cd /parent/folder || exit
unset -v IFS
read skip_header <&3
ret=0
while read src dst rest_ignored <&3; do
mv -- "$src" "$dst" || ret=$?
done
exit "$ret"
) 3< file
同様に、read
デフォルト値$IFS
(またはそれ以降unset IFS
)の場合、単語はスペースまたはタブで区切られます。\
この行自体をエスケープしたり、次の実際の行から行を続行するために使用できます。
CSVファイルの場合
ファイルがCSVファイル(引用符で区切られ、引用符で,
囲まれた値)の場合は、ksh93
シェルでループを実行し、CSV解析に組み込みオプションを-S
使用できます。read
#! /bin/ksh93 -
(
cd /parent/folder || exit
IFS=,
read -S skip_header <&3
ret=0
while read -S src dst rest_ignored <&3; do
mv -- "$src" "$dst" || ret=$?
done
exit "$ret"
) 3< file
ファイルにCSV参照が使用されていない限り、-S
他のPOSIXシェルでも機能するようにこのオプションを選択解除できます。bash
perl
あるいは、CSV解析モジュールまたは他のスクリプト言語を使用することもできます。
(cd /parent/folder && perl -C -MText::CSV -e '
$c = Text::CSV->new;
$ret = 0;
$c->getline(STDIN); # skip header
while (($src, $dst) = @{$c->getline(STDIN)}) {
system "mv", "--", $src, $dst;
$ret = 1 if $?;
}
exit $ret;') < file