나는 md5sum 목록과 많은 파일을 가지고 있으며 체크섬을 계산한 다음 md5sum 목록을 기반으로 이름을 바꾸고 싶습니다.
목록 예:
d4cd401ade018617629b39efed7b7be4 foo.bar
8fdb07ca55c164e0d5a69eff49fe800e bar.foo
8b167d01009f066aaf2d6c1ba336d842 foobar
이제 현재 디렉터리의 모든 파일을 확인하고 체크섬이 위 목록과 일치하면 이름을 올바른 열로 바꾸고 싶습니다.
어떻게 해야 하나요?
답변1
우선 이것이 가장 심오한 해결책이라고 주장하지는 않겠습니다. 그러나 그것은 접근 방식입니다.
체크섬과 파일 이름이 있는 파일이 있다고 가정하면 filelist.txt
다음과 같이 사용할 수 있습니다.
while read -r checksum fname; do for f in file*; do if [[ $checksum == $(md5sum "$f" | cut -d' ' -f1) ]]; then mv "$f" "$fname"; fi ; done ; done < filelist.txt
답변2
아직 완전히 테스트하지는 않았으며 이론상으로만 작동합니다. 필요한 경우 교체하십시오.
#! /bin/bash
for II in *
do
if [ -f "$II" ]; then
TMPV=$(md5sum "$II")
MD="${TMPV%\ \ *}"
TMPV=$(grep "$MD" hashes.txt)
if [ ! -z "$TMPV" ]; then
FN="${TMPV#*\ \ }"
echo "Found: $II"
echo "MD5 is: $MD"
echo "Which matches $FN in hashes database"
echo "Will Rename $II TO $FN"
echo ""
# CAREFUL, RENAME CMD: mv "$II" "$FN"
fi;
fi;
done;
내가 말했듯이 아직 테스트하지는 않았지만 내 상자에서 작동하는 것 같습니다.
답변3
내 생각:
- 먼저 알려진 체크섬을 정렬해야 합니다.
sort checksums.txt > sorted_checksums.txt
- 모든 기존 파일에 대한 파일을 생성하고 정렬합니다.
md5sum * | sort > real_checksums.txt
- 두 파일을 연결하고 이전 이름과 새 이름이 동일한 레코드를 제외합니다.
join -o "2.2 1.2" sorted_checksums.txt real_checksums.txt | awk '$1 != $2' > rename_pairs.txt
- 모든 파일 이름 바꾸기: (
cat rename_pairs.txt | xargs -L 1 echo mv
실제로 파일 이름을 바꾸려면 여기에서 제거)echo
xargs
경고: 파일 이름에 공백이 없는 경우에만 작동합니다. 이를 확인하는 데 사용할 수 있습니다 awk 'NF != 2' sorted_checksums.txt real_checksums.txt
. 행이 인쇄되면 다른 방법(단순 perl
또는 python
절차)을 사용하여 3단계와 4단계를 수행해야 합니다.
답변4
체크섬을 연관 배열로 읽은 다음 파일을 반복하고 필요한 경우 이름을 바꿉니다. 새 이름과 이전 이름이 겹치지 않도록 이름이 바뀐 파일을 별도의 디렉터리 트리에 배치합니다.
#!/bin/bash
mkdir renamed
typeset -A names
while read -r sum name; do
names[$sum]=$name
done <list.md5sum
for file in *; do
if [[ -f $file ]]; then
sum=$(md5sum <"$file"); sum=${sum%% *}
if [[ -n ${names[$sum]} ]]; then
mv -- "$file" "renamed/${names[$sum]}"
fi
fi
done