다양한 하위 디렉터리에 수백 개의 파일이 있습니다. 그 중 일부는 올바른 파일 확장자를 가지고 있지만 다른 것들은 그렇지 않습니다. 파일 확장자가 없는 모든 파일의 이름을 바꾸고 파일 이름에 .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