Добавить расширение файла к файлам, не имеющим расширения

Добавить расширение файла к файлам, не имеющим расширения

У меня есть сотни файлов в различных подкаталогах. Некоторые из них имеют правильное расширение файла, но некоторые — нет. Я хочу переименовать все файлы, у которых нет расширения файла, и добавить расширение .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

Связанный контент