텍스트 파일의 이름을 기반으로 파일 이름을 바꾸는 방법은 무엇입니까?

텍스트 파일의 이름을 기반으로 파일 이름을 바꾸는 방법은 무엇입니까?

한 폴더에 여러 개의 파일이 있습니다. 또한 특정 순서로 나열된 파일 이름(확장자 없음)이 포함된 csv 파일도 있습니다. 파일 이름 시작 부분에 텍스트 파일 목록의 위치를 ​​포함하도록 폴더의 파일 이름을 바꾸고 싶습니다.

즉, 내 폴더에는 다음이 포함됩니다.

aaa.txt, bbb.txt, ccc.txt

파일 이름.csv에는 다음이 포함됩니다.

ccc
aaa
bbb

내가 얻고 싶은 것은 :

1_ccc.txt, 2_aaa.txt 3_bbb.txt 

Bash에서 이 작업을 수행할 수 있나요?

답변1

for i in *.txt
do line=$(grep -nx -m 1 -- "${i%%.*}" filename.csv | cut -f 1 -d ':')
name=${line}_${i}
mv -- "$i" "$name" 
done

설명하다

"${i%%.*}": Kusalananda가 제안한 대로 값을 가져와 $i값의 꼬리에서 패턴을 제거합니다(추가 정보.*매개변수 확장)

grep -nF --

  • -x전체 라인과 일치
  • -m 11개의 일치하는 라인 이후에 파일 읽기를 중지합니다( grep파일이 매우 긴 경우 모든 라인을 읽는 것을 방지하기 위해).
  • --옵션의 끝을 나타내는 데 사용됩니다(자세히-- 쉘에서)

  • -n다음 형식으로 줄 자체 대신 줄 번호를 반환합니다.

    2:aaa 3:bbb 1:ccc

cut -f 1 -d ':':위 결과에서 구분 기호가 있는 필드 1을 추출합니다.

답변2

awk도 옵션일 수 있으며 이름의 공백도 처리할 수 있습니다.

file='filename.csv'
find_path='/home/kali/test/'
extension='.txt'

awk -v find_path=$find_path -v extension=$extension \
'/^$/{NR=--NR; next} \
/^.+/ {print "mv -f " "\"" find_path $0 extension "\" " \
"\"" find_path NR "_" $0 extension "\"" \
}' $file | sh

답변3

파일 이름 접두사가 CSV 파일의 문자열이고 파일 이름에 .txt파일 이름 접미사가 있고 다른 것은 없는 모든 파일의 이름을 바꾸려고 한다고 가정합니다.

#!/bin/sh

suffix=txt

n=0
while IFS= read -r prefix; do
        n=$(( n + 1 ))

        name=$prefix.$suffix
        [ ! -e "$name" ] && [ ! -L "$name" ] && continue

        mv -- "$name" "${n}_$name"
done <filename.csv

prefixwhile이는 루프가 반복될 때마다 CSV에서 한 행을 변수로 읽고 파일 이름을 (정적 문자열)로$prefix.$suffix$suffixtxt${n}_$prefix.$suffixn

mv이 명령은 소스 파일이 존재하는 경우에만 실행됩니다.

이름 충돌에 대한 테스트는 없습니다.

관련 정보