파일 이름에 "_" 접두사로 목록 요소를 추가하는 방법은 무엇입니까?
파일 이름:
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