Bashスクリプト:ファイルの日付順にフォルダのファイル名を変更する

Bashスクリプト:ファイルの日付順にフォルダのファイル名を変更する

たとえば、ファイルの日付順にファイル名を変更したいとします。

file_1.pdf
file_2.pdf

到着する:

file_1_ONE.pdf
file_2._TWO.pdf

スクリプトは、最初のファイルの名前をファイルの日付でソートされた「ONE」に変更する必要があります。

答え1

一部のBSDシステム(Ubuntuシステム、パッケージで利用可能など)でのzshシェルとnumberユーティリティの使用:/usr/gamesbsdgames

number=1
for file in ./file_*.pdf(.Om); do
    mv "$file" "${file%.pdf}_$(number -l "$number" | tr '[:lower:]' '[:upper:]').pdf"
    number=$(( number + 1 ))
done

(.Om)以前のパターンのシェル固有のzsh修飾子です。パターンは通常のファイルのファイル名のリストに展開され、mtimeタイムスタンプ(最後の変更時刻)に従ってソートされ、最も古いファイルからソートされます。

このコマンドは現在の値で呼び出されnumber -l "$number" | tr '[:lower:]' '[:upper:]'、などの対応する英語の単語を大文字で返します。これにより、ファイル名のサフィックスなしでアンダースコアがファイル名の前に追加され、文字列が最後に追加されます。number$numberONETWOTHREE.pdf

または以下を避けてくださいtr

number=1
for file in ./file_*.pdf(.Om); do
    en_number=$(number -l "$number")
    mv "$file" "${file%.pdf}_${en_number:u}.pdf"
    number=$(( number + 1 ))
done

${en_number:u}$en_number(の出力)を大文字に変換しますnumber。修飾子は特定であり、:uに対応します。zsh${variable:u}${variable^^}bash

テスト:

$ for name in file_{1..10}.pdf; do touch "$name"; sleep 2; done
$ ls -lt
total 4
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_10.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_9.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_8.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_7.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_6.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_5.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_4.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_3.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_2.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_1.pdf
-rw-r--r--  1 kk  wheel  163 Jan 31 13:26 script.sh
$ zsh script.sh
$ ls -lt
total 4
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_10_TEN.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_9_NINE.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_8_EIGHT.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_7_SEVEN.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_6_SIX.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_5_FIVE.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_4_FOUR.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_3_THREE.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_2_TWO.pdf
-rw-r--r--  1 kk  wheel    0 Jan 31 13:28 file_1_ONE.pdf
-rw-r--r--  1 kk  wheel  163 Jan 31 13:26 script.sh

答え2

このスクリプトは、増加するカウンターと共に、作成時の順序で現在のフォルダー内の各ファイルの名前をリストします。echo必要なアクションを実行するように行を変更してください:)

#!/bin/bash

((counter=1))

for f in $(ls -1ct); do
    echo $f-$counter
    ((counter+=1))
done

関連情報