한 폴더에 여러 개의 파일이 있습니다. 또한 특정 순서로 나열된 파일 이름(확장자 없음)이 포함된 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 1
1개의 일치하는 라인 이후에 파일 읽기를 중지합니다(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
prefix
while
이는 루프가 반복될 때마다 CSV에서 한 행을 변수로 읽고 파일 이름을 (정적 문자열)로$prefix.$suffix
$suffix
txt
${n}_$prefix.$suffix
n
mv
이 명령은 소스 파일이 존재하는 경우에만 실행됩니다.
이름 충돌에 대한 테스트는 없습니다.