列の一致する情報に基づいてサブディレクトリを削除します

列の一致する情報に基づいてサブディレクトリを削除します

CSV ファイルの対応するディレクトリに存在するサブディレクトリのみを保持したいと思います。ファイル構造は次のようになります。

100_folder/
├── folder_11
├── folder_25
├── folder_31
└── folder_41
210_folder/
├── folder_13
├── folder_23
├── folder_31
└── folder_42

CSV形式の情報:

Col6,Col26
100,folder_11
100,folder_13
100,folder_41
210,folder_31
210,folder_42

列の情報に基づいて、CSV ファイルに存在しないサブディレクトリを削除したいと思います。

ファイルの読み方は次のとおりです。

eCollection=( $(cut -d ',' -f6,26 file.csv ) )
echo "${eCollection[@]}"

答え1

もちろん、私たちはあなたに解決策を提供することができます。しかし、楽しさはどこにあるのでしょうか?

あなたの要件は危険に見えます。なぜなら、csv に含まれていないすべてのフォルダが削除されるからです (タイプミス、間違ったファイル形式/行末、末尾の空白などを想像してください)

ということで、シェル(スクリプト)でテキストファイル処理をする3人の友人を紹介します。

  • 文字列操作(変数)
  • grepテキスト検索 core-util (ファイル内容、読み取り専用)
  • findファイル検索 core-util (ファイル名)

完全に理解していないコードは絶対に使用しないでください。

#!/bin/sh

csvfile='index.txt'
csvseparator=','

cut -d ',' -f6,26 file.csv > index.txt

for subdir in ./*/*/
  do
    subdir=${subdir%/}
    dir=${subdir%/*}
    parent=${dir%/*}
    subdir=${subdir##*/}
    dir=${dir##*/}
    if grep -Fxq "${dir%_*}$csvseparator$subdir" "$csvfile"
      then
        echo "ok: $parent/$dir/$subdir"
      elif grep -wq "^${dir%_*}" "$csvfile"
        then
          echo "no: $parent/$dir/$subdir"
#          find "$parent/$dir/$subdir" -delete
    fi
done

関連情報