Как переместить папки в новый каталог на основе их соответствия в CSV-файле?

251
beginner

В моем нынешнем каталоге у меня есть много папок, таких как F1, F2, F3, F4, F5, F6, F7, F8, F9, F10.

У меня есть CSV-файл "dan.csv" в текущем каталоге, который имеет столбец с именами папок.

CSV-файл выглядит следующим образом: имя столбца "id"

id F1 F4 F5 F6 F8 F10 

Основываясь на их совпадении в CSV-файле, я хотел бы переместить папки в новый каталог «DAN».

Для этого я попытался, как показано ниже:

xargs -a <(tail -n +2 dan.csv) -I{} sh -c '[ -d "{}" ] && mv -t DAN "{}"' 

Это не выдало никакой ошибки, а также не переместило папки в новый каталог «DAN».

1

1 ответ на вопрос

0
LukeLR

Достаточно простого whileцикла bash :

IFS=";" while read othercolumn1 othercolumn2 ... id ... othercolumnx do mv $id DAN/ done < dan.csv 

Он считывает каждую строку из файла CSV, разбивает строку по набору символов в IFSпеременной и сохраняет каждое значение этой строки в соответствующих переменных, указанных в заголовке цикла while.

Убедитесь, что заголовок цикла while (где перечислены все столбцы) соответствует заголовку вашего CSV-файла. Вероятно, вам не нужны значения других столбцов, но, тем не менее, важно прочитать их, иначе каждое значение в CSV будет рассматриваться как idзначение. Если ваш CSV-файл отделен от чего-то другого ;, убедитесь, что IFS=перед whileциклом установлен определенный символ в качестве -value .

Если бы у вас dan.csvбыло четыре столбца, где id - третий, вы бы сделали это так:

IFS=";" while read othercolumn1 othercolumn2 id othercolumn4 do mv $id DAN/ done < dan.csv 
В моем CSV-файле есть только один столбец "ID" с именами папок. Так что дача этого способа работает? пока читаешь id; do mv $ id DAN /; сделано <dan.csv beginner 6 лет назад 0
Да, в случае, если у вас есть только один столбец, вам просто нужно сделать `пока читаю i; делать ... ` LukeLR 6 лет назад 0
Я получил такую ​​ошибку. mv: отсутствует операнд файла назначения после 'DAN /' Попробуйте 'mv --help' для получения дополнительной информации. beginner 6 лет назад 0
Замените `mv $ id DAN /` на `echo $ id` для целей тестирования. Он должен напечатать все имена папок, которые хранятся в CSV-файле без каких-либо пустых строк между ними. Если есть пустые строки, `mv`, конечно, завершается ошибкой, потому что ему нужно как минимум 2 операнда. LukeLR 6 лет назад 0
печатает пустые строки beginner 6 лет назад 0

Похожие вопросы