為沒有副檔名的檔案新增檔案副檔名

為沒有副檔名的檔案新增檔案副檔名

我在各個不同的子目錄中有數百個檔案。其中一些具有正確的檔案副檔名,但有些則沒有。我想重命名所有沒有文件副檔名的文件,並將 .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

相關內容