Intereting Posts
Невозможно перетащить в Qt Creator Синтаксическая ошибка при экспликации сценария оболочки bash из busybox не может получить команду экрана для выполнения кода, содержащего DISPLAY =: 0 Как использовать rsync для резервного копирования каталога без подкаталога git Поток аудио системы через mpd Настройка сетевого принтера для архивирования заданий на печать Как удалить файл без каких-либо разрешений? Как изменить только последнюю строку (или любые конкретные номера строк) с помощью команды awk? Можно ли ссылаться на последний измененный файл в аргументе командной строки? Как s_client превращает ip6-localhost в 127.0.0.1? Сколько полосок (1) -инга подходит для модулей ядра? Загрузка программного обеспечения UEFI Окна диалога Zenity имеют чрезмерную высоту и не могут быть изменены. Ошибка обхода? завершать команду «сверху» после одной итерации – Unix tty мигающий курсор не в точке вставки

Перемещение файлов в отдельные каталоги на основе группировки, определенной в файле CSV

СВЯЗАННЫЕ: Переместить все файлы с соответствующими префиксами в папку на основе списка CSV

У меня есть файл CSV с двумя столбцами (значения, разделенные запятыми), с заголовками:

"id","group" "F1256","old" "E51651","new" "X56369","new" "G5481369","old" "54564564T","old" "544-5F5","new" "1298FFF","old" "JKL-wew_w","new" 

И у меня есть эти файлы в одном каталоге:

 2014-12-15_T921_F1256.png E51651_hf_2018-9-19.jpg hf_oldX56369_15-10-2014.xml 2018-07_xx54564564T_hfdata.bmp G5481369oldbackup_2018-01-01.txt 

Я хочу использовать grep (или любой другой подобный инструмент) для этих файлов и сопоставить их имена с колонкой id моего CSV-файла. При совпадении (т. id Если id точно найден в имени файла), файл должен быть перемещен в соответствующий подкаталог group .

Поэтому в текущем каталоге должны быть созданы две папки, old и new и все эти файлы должны быть перемещены в соответствии с описанным условием.

РЕЗУЛЬТАТ

 old ├──2014-12-15_T921_F1256.png ├──2018-07_xx54564564T_hfdata.bmp ├──G5481369oldbackup_2018-01-01.txt new ├──E51651_hf_2018-9-19.jpg ├──hf_oldX56369_15-10-2014.xml 

Как я могу это сделать?

Решение awk может быть:

 awk -F, 'NR>1 { group[$2]= group[$2]? group[$2] "* *" $1: $1 ;next } END { for (x in group) printf( "echo mv *%s* -t %s\n" , group[x], x ) }' infile.csv| sh 

Уберите echo если вы довольны результатом.

 . ├── infile.csv ├── new │  ├── E51651_hf_2018-9-19.jpg │  └── hf_oldX56369_15-10-2014.xml └── old ├── 2014-12-15_T921_F1256.png ├── 2018-07_xx54564564T_hfdata.bmp └── G5481369oldbackup_2018-01-01.txt 

это приведет к одновременному перемещению всех файлов, относящихся к соответствующей группе каталогов.
о объяснении awk , пожалуйста, посмотрите на мой недавний ответ .

Вы могли бы сделать это, сначала sed n xargs

  sed -e ' s/","/* /;s/^"/*/;s/"$//;1d ' | xargs -l sh -c 'mv $1 "$2"' _ 

Примечание: применяются все предупреждения, которые идут с использованием конвейера xargs, например, кавычки, пробелы и т. Д.

В Python:

 import csv, os, glob filenames = [] filedir = 'files' with open('filelist.csv', 'rb') as f: reader = csv.reader(f) filelist = list(reader) filelist.pop(0) for k, filename in enumerate(glob.glob(filedir + '/*')): filenames.append(os.path.basename(filename)) for (id, directory) in filelist: matches = [e for e in filenames if id in e] for (filename) in matches: if not os.path.exists(directory): os.makedirs(directory) os.rename(filedir + '/' + filename, directory + '/' + filename) 

Попробуй это:

  #!/bin/bash input_file="$1" base_dir="$2" delim="," while read -r line do id=${line%$delim*} group=${line#*$delim} mv *"${id}"* "$base_dir//$group" done < "$input_file" 

В этом примере входной файл процесса, который не содержит строку определения (первая) и id, group, не имеет кавычек