Linux:ファイルの名前を変更しますが、拡張子は保持しますか?


10

Windows / DOSではrename myfile.* yourfile.*、名前は変更しても拡張子はそのままにしておくことができます。Linuxではそれはどのように行われますか?

manページは拡張子を変更する方法を提案するだけですが、それは私が望むものの逆です。

おまけ:の
ようなものを取得するために、実際には写真の作成日をファイル名に入れたいです20091231 2359 New Year.jpg。私はそれを達成するためにいくつかの重要なコマンドの組み合わせが必要だと思いますか?

回答:


14

ボーナスの質問に対する答えは次のとおりです。

20091231 2359 New Year.jpgのようなものを取得するために、実際にはファイル名に写真の作成日を入れたいです。私はそれを達成するためにいくつかの重要なコマンドの組み合わせが必要だと思いますか?

EXIFデータから写真の作成日を取得する場合、そのための別のツールが必要になります。幸いなことにjhead-nオプションを使用して、希望どおりの操作を簡単に行うことができます。

$ jhead -h
 [...]

 -n[format-string]

             Rename files according to date.  Uses exif date if present, file
             date otherwise.  If the optional format-string is not supplied,
             the format is mmdd-hhmmss.  If a format-string is given, it is
             is passed to the 'strftime' function for formatting
             In addition to strftime format codes:
             '%f' as part of the string will include the original file name
             [...]

次に例を示します。

$ jhead -n%Y-%m-%d-%f New_year.jpg   
New_year.jpg --> 2009-12-31-New_year.jpg

編集:もちろん、一連の写真に対してこれを行うには、次のようになります。

$ for i in *jpg; do jhead -n%Y-%m-%d-%f $i; done

日付の形式を好みに合わせて調整するにはdate --help、たとえばの出力を見てください。使用可能なフォーマットコードが一覧表示されます。

(jheadはさまざまなシステムで広く利用できます。たとえば、UbuntuまたはDebianを使用している場合は、単に入力sudo apt-get install jheadしてインストールします。)


1
私は、jheadのことは考えていませんでした。名前の変更、stat、およびcutの醜い組み合わせだけでした。すばらしい答えをありがとう!
Torben Gundtofte-Bruun

10

名前を変更する部分についてのみ、「名前変更」プログラムが機能します。マニュアルページで見た例と同じですが、入れ替えただけです。

justin@eee:/tmp/q$ touch myfile.{a,b,c,d}
justin@eee:/tmp/q$ ls
myfile.a  myfile.b  myfile.c  myfile.d
justin@eee:/tmp/q$ rename -v s/myfile/yourfile/ myfile.*
myfile.a renamed as yourfile.a
myfile.b renamed as yourfile.b
myfile.c renamed as yourfile.c
myfile.d renamed as yourfile.d
justin@eee:/tmp/q$ ls
yourfile.a  yourfile.b  yourfile.c  yourfile.d
justin@eee:/tmp/q$ 

1
一部のディストリビューションでは、このperl名前変更プログラムはprenameと呼ばれています。
camh

これは本当に便利です!「名前の変更」を見つける前に、これらのタイプの質問をいくつ検索しなければならなかったかに驚きました。ありがとうございました。
16

7
betelgeuse:tmp james$ ls myfile.* yourfile.*
ls: yourfile.*: No such file or directory   
myfile.a    myfile.b
betelgeuse:tmp james$ for file
> in myfile.*
> do
> mv "${file}" "`echo $file | sed 's/myfile\./yourfile./'`"
> done
betelgeuse:tmp james$ ls myfile.* yourfile.*
ls: myfile.*: No such file or directory
yourfile.a  yourfile.b

重要なのは、ファイル名の一部を正規表現で変更する方法を示す例を見た場合、それが必要な唯一の例であることです。拡張機能は、UNIXファイルシステムでは特別なステータスはありません-たまたま.文字の後ろにあるファイル名の一部にすぎません。


1
これが私の質問への答えです。(しかし、他の答えは私をそこに早く簡単に連れて行ってくれます。)
Torben Gundtofte-Bruun

4
ford + exec sed:する必要はありませんmv "$file" yourfile"${file#myfile}"。最新のBourneのようなシェル(またはPOSIXシェル)で動作しますが、おそらく実際のBourneシェルでは動作しません。
Chris Johnsen

4

ファイル名を操作するいくつかの異なる方法を次に示します

for f in *.jpg
do
    mv "$f" "before_part${f%.*}after_part.${f##*.}"
    # OR mv "$f" "before_part$(basename "$f" ".jpg")after_part.jpg"
done

コマンドのパラメーター展開は、mv次のように機能します。

${f%.*}-に含まれる文字列の末尾から最短一致パターンを$f削除します。この場合、最後のドット以降のすべてのドットを削除します。シングル%は「最後から最短」を意味します。

${f##*.}-に含まれる文字列の先頭から最長の一致するパターンを削除します。$fこの場合、最後のドットの前と最後のドットを含むすべてです(これには他のドットも含まれます)。二重###)は「最初から最長」を意味します。

たとえば、$f「Foo.bar.baZ.jpg」が含まれている場合:

echo "${f%.*}"

与える

Foo.bar.baZ

そして

echo "${f##*.}"

与える

jpg

したがって、mvコマンドを展開すると、次のようになります。

mv "Foo.bar.baZ.jpg" "before_partFoo.bar.baZafter_part.jpg"

私は実際にはFORループを使用していましたが、MVの例では理解できなかったため、使用しませんでした:-)
Torben Gundtofte-Bruun

注:これらの意味f%f##例えばここで説明されている、:tldp.org/LDP/abs/html/parameter-substitution.html
トーベンGundtofte・ブルーン

3

Linuxにはファイル名拡張子はありません。

正規表現を使用して、ファイル名から特定の部分文字列を切り取り、それらにアクセスします。

例:

実際のシナリオ:chmファイルからhtmlを抽出しています。Windowsのファイル名では大文字と小文字が区別されないため、Linuxではリンクが壊れます。index.HTMLという名前のファイルがありますが、URLにはhref = "index.html"があります。したがって、あなたの目標は、それらへのリンクに一致するようにファイル名を適合させることです。

変数にファイル名があるとします。

FILENAME='index.HTML'

バージョン3.0以降、bashは正規表現自体をサポートしているため、文字列操作を実行するためにgrep / sed / perlなどの追加ツールは必要ありません。次の例は、文字列内のバックエンド一致の置換を示しています。

echo ${FILENAME/%\.HTML/.html}

一致文字列と置換文字列は、必要に応じてパラメータ化できます。これにより、スクリプトを作成するときに柔軟性が向上します。次のコードスニペットは同じ目的を達成します。

match='\.HTML'
replacement='.html'
echo ${FILENAME/%$match/$replacement}

詳細については、bashのドキュメントを参照してください。


1
これらの正規表現の例はありますか?
Gnoupi

+1。この回答は今(編集後)非常に役に立ちます。Bashでそのような文字列操作を実行できるとは思いもしませんでした。
Jonik

確かに、今はもっと良い例です。+1
Gnoupi


0

それを行う方法は常に複数あります。次のスクリプトを/ usr / local / bin / mrenameとして置きます。

次に、写真ファイルを含むスクリプトで、次のように入力します。mrename

スクリプトにオプションのコメント化機能があり、写真を拡大縮小できます(ImageMagickを使用)。

これが一部の人々に役立つことを願っています。

#!/usr/bin/perl
#
# mrename files
#
#
use strict;

# if no 2 args, use defaults
my $dir = ".";

# read in path from command line
$dir = $ARGV[0] if ( defined( $ARGV[0] ) && $ARGV[0] ne "" );

# read in directory contents
opendir( DIR, $dir );
my @files = readdir( DIR );
closedir( DIR );

# rename and/or scale each file in directory
my $number_of_files = scalar( @files );
my $curfile = 0;

foreach my $file( @files ) {
    # only rename and scale jpg/gif files
    if ( $file =~ /\w+\.(jpg)$/ ) {
        my $extension = $1;
        $extension =~ tr/A-Z/a-z/;
        my $full_filename = "$dir/$file";

        # get stats on file- specifically the last modified time
        (my $dev,my $ino,my $mode,my $nlink,my $uid,my $gid,my $rdev,my $size,
        my $atime,my $mtime,my $ctime,my $blksize,my $blocks) = stat($full_filename);

        # convert last-modified time from seconds to practical datetime terms
        (my $sec,my $min,my $hour,my $mday,my $mon,my $year,my $wday,my $yday,
        my $isdst) = localtime($mtime);

        ++$mon;
        $year += 1900;

        my $filecdate = sprintf( "m%04i%02i%02i_%02i%02i%02i.$extension", $year, $mon, $mday, $hour, $min, $sec );
        my $full_newfilename = "$dir/$filecdate";

        # to scale files, use imagemagick by using the command below instead of mv 
        #my $cmd = "convert $full_filename -resize $scale% $full_newfilename";
        my $cmd = "mv $full_filename $full_newfilename";
        system( $cmd );

        # update percentage done
        my $percent_done = sprintf( "%5.2lf", 100* (++$curfile) / $number_of_files );
        print "\r$percent_done%";
    }
}
print "\n";

0

この-X/--keep-extensionオプションはrename(バージョン1.600)で使用できます。

-X, --keep-extension Save and remove the last extension from a filename, if there is any. The saved extension will be appended back to the filename at the end of the rest of the operations.

rename MacにはHomebrewから、LinuxにはLinuxbrewから(もちろん他のインストールオプションも)利用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.