web-dev-qa-db-ja.com

拡張子のないファイルにファイル拡張子を追加する

さまざまなサブディレクトリに何百ものファイルがあります。それらのいくつかは正しいファイル拡張子を持っていますが、いくつかはそうではありません。ファイル拡張子のないすべてのファイルの名前を変更し、ファイル名に.mp4拡張子を追加したいと思います。他のファイルはそのままにしておく必要があります。 Bashを使用してこの名前変更操作を自動化するにはどうすればよいですか?それとも、PerlやPython=のような実際のスクリプト言語が必要ですか?

2
ThoWe

このようなもの:

find . -type f  ! -name "*.*" -exec mv {} {}.mp4 \;
8
Jaur

これを試して:

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
Sundeep

globstarの方法:

#!/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 $!;
    }
}
0
Ferroao

これにより、現在のディレクトリにある、ファイル拡張子のないすべてのファイルの名前が変更されます。

例:ディレクトリには、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

0
fame