修正日のタイムスタンプに基づいて複数のファイルに番号を付けますか?

修正日のタイムスタンプに基づいて複数のファイルに番号を付けますか?

だから文書を時間順にたくさんダウンロードしましたが、コピーして編集しなければならないので修正日が変わりました。ダウンロードした順に前に数字(001_、002_...)を追加したいと思います。

答え1

そしてzsh

autoload zmv
n=0; zmv -n '*(#qOm)' '${(l[3][0])$((++n))}_$f'

(満足している場合は削除してください-n(ドライランの場合))。

それは:

  • zmv:zsh拡張globと置換演算子を使用してファイル名を変更する自動ロード機能
  • *: 現在のディレクトリに隠されていないすべてのファイル
  • (#q...):グローバル修飾子の冗長な形式を導入します。
  • Om:年齢順にソートしました。だから最新の最後。
  • ${(l[3][0])$((++n))}$((++n)):幅3の左側にゼロパディングを適用して展開します。
  • _$f追加_およびソースファイル名

答え2

解決策が見つかりましたここ

ls -1tr |rename -v 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.pdf", $i++)/e'

答え3

find . -type f -printf '%C@ %p\0' |
  sort -z -n |
  awk  'BEGIN{RS=ORS="\0"};{print $2}' | 
  rename -0 -n 'our $i;
                s:(^.*/)([^/]*):sprintf("%s%04d_%s",$1,++$i,$2):e'

これは、GNUを使用して、UNIXエポック()の後の秒単位の数値形式の修正タイムスタンプと、空白文字が前に付けられたNULで区切られたファイル名(つまりフルパス)findを印刷します。%p%C@

必要に応じて、findここにある他のオプションを使用してファイル検索を細分化することができます(たとえば、-name "*.pdf"など-maxdepth 2)。

findsort次に、オプションを使用して、NULで区切られた入力を数値(タイムスタンプに基づいて)に並べ替え、出力をGNUにパイプし、-z -nawkでタイムスタンプとスペースを削除し、最後にperlの名前変更スクリプトにパイプします。

Perlの名前変更スクリプトは、この-0オプションを使用してSTDINからNULで区切られたレコードを読み取り、次の操作を行います。

  • sprintf()'%s%04d_%s'(%04d_ゼロパディング、幅4桁、アンダースコア)と一緒に使用され、$i名前のファイル名部分を置き換えるためのカウンタとして使用されます。

    $1は完全なファイル名のパス部分であり、$++i自動インクリメントカウンタ変数であり、デフォルトの$2ファイル名です。

  • $iグローバル変数として宣言すると、ourループが繰り返されるたびに値が保持されます(そうでない場合は毎回ゼロにリセットされます)。

この-nオプションはテスト実行ジョブに切り替えます。会議名前が変更されました。必要に応じて動作することを確認したら、削除して-n出力のないファイルの名前を自動的に変更するか、-v詳細な出力に変更してください。

ls -1trこれを使うのとは異なりいいえファイル名に改行文字が含まれていると中断されます。それは一緒に働くどの有効なファイル名です。


参考までに、各ファイル名の後に正しい形式の日付を追加するには、私のrenameスクリプトを参照してください。ファイル名の末尾に変更された日付タイムスタンプを使用して複数のファイルの名前を変更しますか?。ファイル名に日付と時刻のプレフィックスを追加するように簡単に変更されます。タイムスタンプを取得するために各ファイルで実行さstatれるため、ファイル名を事前にソートする必要はありません。

例えば

rename -n 'BEGIN {use Date::Format};
           die $! unless -f $_;
           next if (m/^\d{8}-$/);
           my $ts=(stat($_))[9];
           my $dt=time2str("%Y%m%d-%H%M%S",$ts);
           $_ = "$dt-$_"' *.pdf

関連情報