csv 목록을 기반으로 일치하는 접두사가 있는 모든 파일을 폴더로 이동합니다.

csv 목록을 기반으로 일치하는 접두사가 있는 모든 파일을 폴더로 이동합니다.

csv 목록에 다양한 접두사가 포함된 수천 개의 파일이 그룹화되어 있습니다. 이제 목록을 기반으로 해당 폴더로 모두 이동하고 싶습니다.

예: 파일 A1B1C1_{...}.png, A1B2C2_{...}.png, A1B1C3_{...}.png 등 CSV 목록:

Name   Group
A1B1C1 John
A2B1C1 John
A1B2C2 Denver
A1B1C3 Nick

이제 A1B1C1_ 및 A2B1C1_ 접두사가 붙은 모든 파일을 John 폴더로, A1B2C2_ 접두사가 Denver 폴더로, A1B1C3_ 접두사가 Nick 폴더로 이동하고 싶습니다.

나는 생각 중입니다

for group in *_*.csv; 
 do {...}

하지만 csv 파일에서 목록을 읽는 방법과 목록 구문에서 파일을 이동하는 방법을 잘 모르겠습니다.

저는 CentOS에서 작업 중입니다. 정말 감사합니다.

답변1

awk 'NR > 1 { print $1, $2 }' list.csv |
while read -r prefix group; do
    find . -type f -name "$prefix*" -exec sh -c '
        group="$1"; shift
        mkdir -p "$group"
        for name do echo mv "$name" "$group"; done' sh "$group" {} +
done

awk이는 while 루프에 대한 접두사 및 그룹 이름을 제공하는 데 사용됩니다 (목록 파일의 헤더 건너뛰기). 이는 모든 접두사 및 그룹 이름에 공백이나 탭이 없다고 가정합니다.

while 루프 호출은 find이름이 주어진 접두사로 시작하는 현재 디렉터리 안이나 아래의 모든 일반 파일을 찾습니다. 이러한 모든 파일에 대해 다음과 같은 짧은 쉘 스크립트가 호출됩니다.

group="$1"
shift

mkdir -p "$group"
for name do
    echo mv "$name" "$group"
done

스크립트에서는 그룹 이름이 명령줄의 첫 번째 인수가 되고 나머지 인수는 그룹 디렉터리로 이동할 파일의 경로 이름이 될 것으로 예상합니다.

스크립트는 현재 작업 디렉토리에 그룹 디렉토리가 없으면 그룹 디렉토리를 생성한 다음 지정된 경로 이름을 반복하여 각 파일을 제자리로 이동합니다. 파일을 덮어썼는지 확인하지 않습니다.

실제 작동 echo으로부터 보호됩니다 . mv코드를 실행하여 제대로 echo작동하는지 확인한 다음 echo.

답변2

이와 같은 스크립트로 작업을 수행할 수 있습니다. 이러한 작업을 수행하는 방법에 대한 아이디어를 제공하기 위해 아래 코드를 메타 언어로 생각하십시오!

for i in `ls *.PNG`
do
a=$(echo $i | awk -F_ '{print $1}')
b=$(grep $a file.csv|awk '{print $2}')
mv $i $b/
done

관련 정보