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