확장자가 없는 파일에 파일 확장자를 추가합니다.

확장자가 없는 파일에 파일 확장자를 추가합니다.

다양한 하위 디렉터리에 수백 개의 파일이 있습니다. 그 중 일부는 올바른 파일 확장자를 갖고 있지만 일부는 그렇지 않습니다. 파일 확장자가 없는 모든 파일의 이름을 바꾸고 파일 이름에 .mp4 확장자를 추가하고 싶습니다. 다른 파일은 그대로 두어야 합니다. Bash를 사용하여 이름 바꾸기 작업을 어떻게 자동화할 수 있나요? 아니면 이를 위해 Perl이나 Python과 같은 실제 스크립트 언어가 필요합니까?

답변1

이 같은:

find . -type f  ! -name "*.*" -exec mv {} {}.mp4 \;

답변2

이 시도:

find -type f -not -name '*.mp4' -exec rename -n 's/$/.mp4/' {} +

현재 디렉터리와 하위 폴더에서 다음으로 끝나지 않는 모든 파일을 확인하고 .mp4이름을 바꾸어 확장명을 추가합니다.

perl기반 rename명령을 가정하고 -n옵션은 파일 이름이 어떻게 바뀌는지 표시하는 것입니다. 문제가 없으면 옵션을 제거하고 명령을 다시 실행하십시오.


예:

$ find -type f
./rand_numbers.txt
./tst
./abc/123
./abc/zyx.txt

$ find -type f -not -name '*.mp4' -exec rename -n 's/$/.mp4/' {} +
rename(./rand_numbers.txt, ./rand_numbers.txt.mp4)
rename(./tst, ./tst.mp4)
rename(./abc/123, ./abc/123.mp4)
rename(./abc/zyx.txt, ./abc/zyx.txt.mp4)

.이름이 없는 파일 이름을 의미하도록 확장자가 없는 파일을 정의하는 경우 다음을 사용합니다.

$ find -type f -not -name '*.*' -exec rename -n 's/$/.mp4/' {} +
rename(./tst, ./tst.mp4)
rename(./abc/123, ./abc/123.mp4)

답변3

글로브스타 방식:

#!/bin/bash
# Warning: globstar excludes hidden directories.
# Turn on recursive globbing (in this script) or exit if the option is not supported:
shopt -s globstar || exit
for f in **; do
if [ -f "$f" ]; then
    case "${f##*/}" in         
        *.*) continue ;;       
    esac
   mv "$f" "$f".mp4;
fi
done

Perl 방식, 덮어쓰기를 피하기 위해 대상이 존재하는 경우 _2를 추가합니다.

#!/usr/bin/perl
use warnings;
use strict;

use File::Find;

find(\&rout, ".");
sub rout {
    next if -d $_;
    my $new_name = $_;
    $new_name    =~ s/^([^.]+)$/$1.mp4/;     
    chdir($File::Find::dir);
    if(-e $new_name){
    my $new_name2 = $_;
    $new_name2    =~ s/^([^.]+)$/$1\_2.mp4/; 
    rename($_, $new_name2) or die $!;
    } else {
    $new_name    =~ s/^([^.]+)$/$1.mp4/;  
    rename($_, $new_name) or die $!;
    }
}

답변4

이렇게 하면 아직 파일 확장자가 없는 현재 디렉터리의 모든 파일 이름이 변경됩니다.

예: 디렉터리에 file1, file2, file3이라는 파일이 있습니다. file1.mp4, file2.mp4, file3.mp4로 이름이 변경됩니다.

for file in *; do mv "$file" "${file}.mp4" done

제외해야 할 점이 있는 파일이 있는 경우:

for file in *; do [[ $file == *.* ]] && continue mv "$file" "${file}.mp4" done

또는 shopt -s extglob을 사용하면 다음과 같습니다.

for file in +([^.]); do mv "$file" "${file}.mp4" done

관련 정보