さまざまなサブディレクトリに何百ものファイルがあります。そのうちのいくつかは正しいファイル拡張子を持っていますが、他のものはそうではありません。ファイル拡張子を持たないすべてのファイルの名前を変更し、ファイル名に.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