名前と拡張子が不明なファイル名の一括変更

名前と拡張子が不明なファイル名の一括変更

私はたくさんの写真を持っています。一部はあり、.jpg一部はです.png。与えられた画像は完全に任意の名前を持つことができます(スペースを含めることができます)。特定のディレクトリ内で拡張子を変更せずにすべてのディレクトリの名前を変更するにはどうすればよいですか?たとえば、次のようになります。

001.jpg
02.png
05.png
zzzz.jpg

0001で始まり9999(必要な場合)、4桁の数字で名前を完全に変更したいと思います。したがって、出力は次のようになります。

0001.jpg
0002.png
0003.png
0004.jpg

このファイルの順序は私にとって重要ですが、ファイル名で並べ替えると、すでに順に並べ替えられています。

私はPerlをチェックしてみましrenameたが、この例ではPerlの使い方は私にとって謎です。

答え1

Perlソリューション

perl -e '
    @files = sort glob "*.png *.jpg";
    for(@files){ 
        ($extension = $_) =~ s/.*\.(.*)/$1/;
        $new_name = sprintf("%04d",++$counter).".$extension";
        die "File $new_name already exists and would be clobbered\n" if -e $new_name;
        rename $_ => sprintf("%04d",++$counter).".$extension"
     }'

カンクンソリューション

export COUNT=0 
find . -maxdepth 1 -name "*.jpg" -o -name "*.png" -print0 | xargs -0 sort | while read file do\
extension=${file##*.}\
COUNT=$((COUNT+1))\
mv -- "$file" $(printf "%04d" $COUNT).$extension\
done

ノート

  • どちらのソリューションもテストされていない Bash ソリューションです。まずダミーファイルで試してみてください。
  • ファイル名に改行文字が含まれていると、Bashソリューションがクラッシュする可能性があります。
  • 危険:Gillesが以下の説明で指摘したように、元のファイルの1つの名前がターゲットの命名規則に従うと、せいぜい別の「数字」に名前が変更され、最悪の場合は他のファイルによって破損します。何が起こるかは、他のファイルに対してどのようにソートされるかによって異なります。 OPが好むようだったので、これをPerlソリューションに追加しました。
  • Perlソリューション(上記の実装)は次のとおりです。非等性

答え2

(bash解決策)

printf新しい名前をフォーマットし、awkファイル拡張子を選択するために使用されます...

$ ls
a.b  c.d  e.f  g.h  i.j  k.l  m.n  o.p  q.r  s.t  this file.y  u.v  w.x
$ COUNTER=0
$ for i in *; do COUNTER=$(($COUNTER + 1)); mv -v "$i" $(printf "%04g" $COUNTER).$(echo $i | awk -F'.' '{print $NF}'); done
`a.b' -> `0001.b'
`c.d' -> `0002.d'
`e.f' -> `0003.f'
`g.h' -> `0004.h'
`i.j' -> `0005.j'
`k.l' -> `0006.l'
`m.n' -> `0007.n'
`o.p' -> `0008.p'
`q.r' -> `0009.r'
`s.t' -> `0010.t'
`this file.y' -> `0011.y'
`u.v' -> `0012.v'
`w.x' -> `0013.x'

$i前述のように、ファイル名のスペースをエスケープするには、入力を引用符で囲む必要があります。

答え3

存在するTxR不明な言葉:

(let ((counter 0))
  (each ((name (sort (glob "*.{png,jpg}"))))
    (let ((new (pic "0###<" (inc counter) (short-suffix name))))
      (if (path-exists-p new)
        (error `@new already exists`))
      (rename-path name new))))

まず、名前変更リストを準備し、同時に正しい名前が存在することを確認するなど、他の操作を実行できます。この場合、名前の変更は行われません。

ここに画像の説明を入力してください。

答え4

このスクリプトを保存してください。

#!/bin/bash

NUM=0
NUMBER_LENGTH=4

cd $1;

ls . -1 | sort | while read file; do
    NUM=$(( $NUM + 1 ));
    PREFIX=$NUM;
    while [ ${#PREFIX} != $NUMBER_LENGTH ]; do
        PREFIX="0${PREFIX}";
    done;
    NEW_NAME=$PREFIX.`echo $file | sed 's|[^.]\+\.\([\A-Za-z0-9]\+\)|\1|g'`;
    mv "$file" "$NEW_NAME";
done

次のように実行します。

./_scriptname_ _dirWhereYourStuffIs_

注:スクリプト自体の名前が変更されるため、スクリプトをジョブと同じディレクトリに配置しないでください。

十分に狂った場合は、スクリプトを使用せずに1行ですべての操作を実行できます。

NUM=0; NUMBER_LENGTH=4; ls . -1 | sort | while read file; do NUM=$(( $NUM + 1 )); PREFIX=$NUM; while [ ${#PREFIX} != $NUMBER_LENGTH ]; do PREFIX="0${PREFIX}"; done; NEW_NAME=$PREFIX.`echo $file | sed 's|[^.]\+\.\([\A-Za-z0-9]\+\)|\1|g'`; mv "$file" "$NEW_NAME"; done

注#2:この行はBASHを使用していると想定しています。

関連情報