Unix традиционно придерживается традиции «механизм, а не политика». В случае драйверов устройств это означает, что идентификатор драйвера в ядре - это просто старший / младший номер устройства. Присвоение имени устройству («политика *) с помощью mknod оставлено на усмотрение пользователя.
Попробуйте следующее:
find -type f -not -name '*.mp4' -exec rename -n 's/$/.mp4/' {} +
Это проверяет все файлы в текущем каталоге и его подпапках, которые не заканчиваются на .mp4
, и переименовывает их, добавляя расширение
Предполагает perl
на основе команды переименовать
, параметр -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)
Путь глобуса:
#!/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 way, добавляя _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 $!;
}
}
Это переименует все файлы в текущем каталоге, у которых НЕТ расширения файла..
Пример :в вашем каталоге есть файлы с именами :файл1, файл2, файл3. Они будут переименованы в файл1.mp4, файл2.mp4, файл3.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