我在各个不同的子目录中有数百个文件。其中一些具有正确的文件扩展名,但另一些则没有。我想重命名所有没有文件扩展名的文件,并将 .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