CSV 파일에 정의된 그룹화에 따라 파일을 별도의 디렉터리로 이동합니다.

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파일 이름에서 정확히 발견된 경우) 해당 파일을 적절한 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

어떻게 해야 하나요?

답변1

해결책은 다음 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다음을 참조하세요.내 최근 답변.

답변2

먼저 sed n xargs로 이 작업을 수행할 수 있습니다.

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

참고: 따옴표, 공백 등과 같이 xargs 파이프를 사용할 때 주의해야 할 모든 주의 사항은 다음과 같습니다.

답변3

파이썬에서는:

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)

답변4

이 시도:

    #!/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와 그룹이 인용되지 않습니다.

관련 정보