파일 이름에 목록 줄을 접두사로 추가

파일 이름에 목록 줄을 접두사로 추가

파일 이름에 "_" 접두사로 목록 요소를 추가하는 방법은 무엇입니까?

파일 이름:

aaa.gf
bbr.gf
cee.gf

목록.txt:

pplo
125ss
35w2

원하는 결과:

pplo_aaa.gf
125ss_bbr.gf
35w2_cee.gf

모든 요소는 동일한 폴더에 있습니다. 모든 개체 파일은 .gf로 끝납니다. list.txt의 행은 예제에 표시된 대로 알파벳 순서로 파일 이름과 일치해야 합니다.

멈췄어요:

for f in *.gf; do mv "$f"  LINE_"$f"; done

LINE을 작동시키는 방법을 모릅니다.

감사해요.

답변1

어때요?

mapfile -t list < list.txt

i=0
for f in *.gf; do 
  echo mv "$f" "${list[i++]}_$f"
done

echo올바른 일을 하고 있다고 생각되면 제거하세요.

답변2

POSIX sh구문을 사용하십시오.

#! /bin/sh -
for f in *.gf; do
  IFS= read -r line <&3 || break
  mv -i -- "$f" "${line}_$f"
done 3< list.txt

Globbing(여기서 *.gf)은 파일 목록을 어휘순으로 정렬합니다(최신 및 POSIX 호환 셸의 로케일 조합에 따라).

답변3

paste(1)유틸리티를 사용하십시오(느린 쉘 루프를 방지하고 전반적으로 더 간단함).

# example list of files:
ls > files

paste -d_ list files

필요한 경우 mv상황이 약간 더 복잡해집니다.

paste -d_ list files | paste files - | xargs -n2 echo mv

echo떠날 준비가 되면 제거하세요.

왜냐하면 우리는 제외하고

모든 것이 POSIX sh와 호환되어야 하므로 이식성이 뛰어납니다.

하지만 제가 가장 좋아하는 부분은 쉽게, 대화식으로, 한 조각씩 합쳐질 수 있다는 것입니다.

답변4

GNU 병렬 처리 사용:

parallel mv {1} {2}_{1} ::::+ filenames list.txt

또는:

parallel mv {1} {2}_{1} ::: * ::::+ list.txt

관련 정보