一致に応じてフォルダを別のフォルダに移動

一致に応じてフォルダを別のフォルダに移動

次のテキストファイルがあります。

    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行ごとにxargs1つのコマンドが実行されます。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

おすすめ記事